Verifying the GLBs in three.js (not just Blender) showed four assets reporting inflated bounds: tramp_01 came back 3.29 x 1.27 m against a true 2.96 x 0.78. Box3.setFromObject expands each mesh's LOCAL box by the world matrix, so a node carrying a rotation over-reports — the same trap Blender's obj.bound_box sets, and what three uses for frustum culling. Joined nodes inherited parts[0]'s rotation, which for an arc is half a segment step off-axis. Applying rotation at join time makes every local box axis-aligned, so the default Box3 path is now correct for consumers and culling is tight. World geometry is unchanged; the exported dims are identical. Adds tools/assetcheck/, the three.js harness that caught this. It's the only check that can: a Blender round-trip exports Z-up->Y-up and imports Y-up->Z-up, so a broken export_yup flips back and passes green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
31 KiB
31 KiB