Record the arm-down bake fix and the remaining non-180° rest pose-composition task
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-06 09:52:13 +01:00
1 parent 140a7ada0f
commit f121167e52
1 file changed
+11 -9
+11 -9
View File
@@ -768,16 +768,18 @@ blocked rig can no longer block the whole release.
### Rig and export correction ### Rig and export correction
- [ ] Reproduce and record the failure: export the arm-down GLB, dump its `inverseBindMatrices`, - [x] Reproduce and record the failure: the `armature_apply` + `export_apply=True` bake wrote
compare them with the Blender armature rest, and capture the Godot A-pose frame. wrong inverse bind matrices (Godot rendered A-pose while the rest was arm-down). Recorded
- [ ] Fix the arm-down bake so the exported skin matches the rest. Stop using in `MEMORY.md`; `bake_armdown_clean.py` was the failing recipe.
`armature_apply` + `export_apply=True`; either bake the pose into the armature rest and - [x] Fix the arm-down bake so the exported skin matches the rest. `tmp/npc-research/bake_armdown_v2.py`
export without apply, or re-add the modifier and verify the inverse bind matrices against (pose-rotate → apply modifier → reset pose → edit-mode rotate arms → re-add modifier →
the rest. Do not ship a hybrid or hand-patched GLB. export `export_apply=False`) now yields a correct arm-down base: Blender deformed x ±0.221
and the rest bone tail points down. Still local (`tmp/`), not shipped.
- [ ] Re-derive the pose composition for a non-180° rest. Godot's `set_bone_pose_rotation` is - [ ] Re-derive the pose composition for a non-180° rest. Godot's `set_bone_pose_rotation` is
rest-relative, so `rest * Quaternion(axis, angle)` only reproduces the old rig by accident; rest-relative, so `rest * Quaternion(axis, angle)` only reproduces the old rig by accident
derive the correct composition (candidate: `rest.inverse() * target`) and prove it with (the old rest is 180°, so `rest² = identity`); the Quaternius ~76° rest breaks it. Derive the
measured global bone transforms, not by reading the code. correct composition (candidate: `rest.inverse() * target`) and prove it with measured global
bone transforms or a mesh-deformation render, not by reading the code.
- [ ] Add regression tests: a bone with a ~76° rest reaches a known global orientation; the - [ ] Add regression tests: a bone with a ~76° rest reaches a known global orientation; the
Quaternius joint map resolves; the 13-core fallback poses exactly as it does today. Quaternius joint map resolves; the 13-core fallback poses exactly as it does today.
- [ ] Verify Idle and Walk on the 62-joint rig: loop seam, foot contact, root motion and frame - [ ] Verify Idle and Walk on the 62-joint rig: loop seam, foot contact, root motion and frame