The pile was the model I had been told twice was wrong and had twice failed
to find anything wrong with. A reference photograph of a real woodstack
found it in one look: ours was five long sticks lying across each other,
and the reference was forty short logs nested into courses.
The cause was a single rotation. `latheGeometry` builds along Y, and the
logs were turned with `rotateZ(PI/2)`, which sends +Y to -X -- so every log
lay along the X axis. That is the same axis the layout spaces them along.
Each log was 0.62 m long and its neighbour's centre was 0.13 m away, so
every log ran through roughly five of its neighbours. `restingHeight` was
right the whole time; it was solving tangency for an orientation the
geometry did not actually have. Rotating about X instead sends +Y to +Z,
which is the axis the solver assumes, and the pile immediately settles into
courses that rest on each other.
Nothing in the check suite could see this. Support saw one connected mass
and passed it, which is exactly what a heap of interpenetrating logs looks
like to a connectivity test.
Two smaller things the same photograph showed. The file header claims the
sawn ends are "far lighter than the bark" and that the pale discs are the
first thing you see; at +0.07 lightness they were a slightly different
brown, so the offset now delivers what the comment promises. And twelve
logs read as some firewood rather than as a stack, so the default is denser.
Also: .gitignore and .gitattributes were still entirely in Turkish. The
earlier translation sweep matched on file extension and never looked at
extensionless files. src/viewer.css tripped the scan too, but that was 80
occurrences of the CSS `var()` function, not Turkish.
27 models, 17393 triangles, all checks pass, 0 floating cases.