Land the spilled coins, plane the bench's tenons, and sharpen the support check

Three defects reported from looking at the models, and the first of them
says something about the check that was supposed to catch it.

Every third coin was lifted to "land on top of the previous one" while its
position stayed independently scattered, so it was almost never above
anything and simply hovered about 3 mm off the ground. A stacking coin now
takes the previous coin's PLACE as well as its height. The tilted ones were
lifted by half their thickness plus their circumradius; a coin is a
nine-sided prism and can come to rest on a face rather than a corner, so
the lift uses the apothem and its own radius, erring towards bedding into
the ground rather than floating above it.

The support check missed all of that, and the reason is worth writing down:
its voxel is the model's extent over the resolution, so at 64 a 0.19 m coin
pouch gets a 3 mm voxel -- exactly the size of the gap it existed to find. A
check coarser than the defect it hunts is worth very little. At 112 the
whole suite still runs in fifteen seconds.

Raising it immediately turned up a real fault nobody had seen. The log
pile's sawn ends were cut to exactly the body's end radius and placed
exactly at its rim, so disc and lathe met along a seam of no width: they
touched and never overlapped, and there was nothing joining them but two
edges in the same place. The caps are now three percent wider and seated
slightly inside, which is two millimetres here and true of a real log
anyway, since bark wears back from a cut face.

And the bench's through-tenons stood 42 mm proud of the seat -- a block of
oak the size of a thumb sticking straight up out of the surface you are
meant to sit on. A real through-tenon is wedged and then planed back, so
what shows is end grain and a hairline of shoulder. Three millimetres
proud, ten housed below.

28 models, 20 547 triangles, all checks pass at resolution 112, 0 floating
cases, build clean.
This commit is contained in:
CRTkafa 2026-08-23 13:23:09 +07:00
parent 2b6e2b4d02
commit 1888616315
8 changed files with 175 additions and 64 deletions

View file

@ -136,15 +136,27 @@ export function createModel(overrides: Partial<WoodenBenchConfig> = {}) {
))
}
// Tenon: the end of the leg that runs THROUGH the seat and shows on
// top of it. It overshoots the seat's top face — the most recognisable
// detail of a medieval bench.
// Tenon: the end of the leg running THROUGH the seat and showing on
// top of it as a panel of end grain. It is the most recognisable
// detail of a medieval bench -- and it is nearly FLUSH.
//
// At 1.9 seat thicknesses it stood 42 mm proud of the seat: a block of
// oak the size of a thumb sticking straight up out of the surface you
// are meant to sit on. A real through-tenon is wedged and then planed
// back, so what shows is the grain and a hairline of shoulder, not a
// peg. Three millimetres proud, ten millimetres housed below.
const proud = seatThickness * 0.05
const housed = seatThickness * 0.16
legPieces.push(chamferedBoxGeometry(
[legWidth * 0.34, timber * 0.85],
[legWidth * 0.32, timber * 0.8],
seatThickness * 1.9,
seatThickness + proud + housed,
timber * 0.16,
[side * legX, seatBottom + seatThickness * 0.75, jitter(random, timber * 0.1)],
[
side * legX,
seatBottom + (seatThickness + proud - housed) / 2,
jitter(random, timber * 0.1),
],
tint('oak', 0.09),
))
}