4d6a4f6006
tools/export_boat_prop.py (GLM-implemented, 2 rounds): hull at game scale (8.5 m, keel 0, no recenter) + placeholder mast/sail/steering oar + 5 seat markers + waterline + 1.9 m ref figure; self-verify incl. right-side-up gates added after round 1 shipped an upside-down hull with all checks green. Registry: boat actions table (6 slots, direct names). README carries CC BY 4.0 attribution + iClone import/filming notes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
2.5 KiB
Markdown
47 lines
2.5 KiB
Markdown
# FIX ROUND: defects found in boat_prop.fbx by independent visual verification
|
||
|
||
Your self-verify passes but the boat is **visually wrong**. Renders of your FBX vs a
|
||
raw import of the source GLB prove two defects. Fix `tools/export_boat_prop.py`,
|
||
re-run until BOTH the existing self-verify AND the new checks below pass, then update
|
||
`plans/boat-prop-export-results-2026-07-17.md`.
|
||
|
||
## Defect 1 — hull is UPSIDE DOWN
|
||
|
||
In your export the canoe's carved prows curl DOWN below the waterline and the belly
|
||
bulges up. Ground truth: `bpy.ops.import_scene.gltf` on the source GLB already gives a
|
||
RIGHT-SIDE-UP canoe in Blender's Z-up frame (deck opening faces +Z, prows sweep up).
|
||
The glTF importer performs the Y-up→Z-up conversion itself — your extra game→Blender
|
||
axis conversion (the C3 matrix) double-rotates the mesh.
|
||
|
||
**Correct transform chain** (nothing else):
|
||
1. Import GLB; apply all transforms (bakes the importer's rotation into vertices).
|
||
2. Rotate about **Z only** so the bow lies along −Y (raw bow is along +X after step 1).
|
||
3. Scale ×8.5 uniformly; apply.
|
||
4. Translate Z only so min-Z = 0. **Do NOT translate or recenter X/Y** — the game uses
|
||
the GLB's own origin (Defect 2).
|
||
|
||
## Defect 2 — hull was recentered on X
|
||
|
||
The canoe is a SINGLE outrigger (one ama, one side) yet your export's X bounds are
|
||
symmetric (±2.82) — you recentered by AABB. The game never translates X; keep the
|
||
GLB's own lateral placement so the hull centerline stays where the seat markers
|
||
assume it. After the fix, report which side the ama extends to (expect −X, the
|
||
Seat_Fisher side, if the game-equivalent yaw is right; report honestly if it's +X).
|
||
|
||
## New self-verify checks to ADD (these would have caught both defects)
|
||
|
||
- **Right-side-up**: the hull's LOWEST vertex (z≈0, the keel) must lie near midships
|
||
(|y| < 2.0 m), and the hull's HIGHEST vertices (prow carvings) must lie near the
|
||
ends (|y| > 3.0 m). An upside-down canoe fails both.
|
||
- **Not recentered**: the hull mesh's X bounds must be ASYMMETRIC about 0 (single
|
||
outrigger): assert `abs(abs(minX) - abs(maxX)) > 0.5` m.
|
||
|
||
## Verification renders (run these yourself and STATE in the report what you see)
|
||
|
||
Render workbench snapshots (¾ view + side view) of the final FBX re-imported, e.g.
|
||
camera at (14,−12,8) looking at (0,0,1.2). The canoe must sit prows-up on the
|
||
waterline rectangle like a boat, not like a banana on its back.
|
||
|
||
Everything else from the original plan stands (guardrails §6 included: no commits,
|
||
ariki-game read-only). The waterline-as-4-named-rails deviation is ACCEPTED — keep it.
|