diff --git a/MEMORY.md b/MEMORY.md index 0d6e86a..ee54f31 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -127,6 +127,11 @@ canonical implemented-features list in `docs/development-status.md`. out of a portrait frame (park the rest of the crowd away instead). - Blender: `bisect_plane` and thin bevels leave zero-area triangles (Godot "non-finite normal in LOD generation"); `_clean()` + a weld after bisect fixes them and the audit rejects them. +- Quaternius arm-down bake: pose-rotate `UpperArm.L/R` −90° local X → apply Armature modifier → + `armature_apply` → re-add modifier bakes the rest, but `export_apply=True` writes wrong inverse + bind matrices (Godot renders A-pose even though the rest is arm-down). The runtime `_pose_bone` + `rest * Quaternion(axis, angle)` only cancels when `rest² = identity` (old rig's 180° rest); the + Quaternius ~76° rest does not, so the pose formula must be re-derived for a non-180° rest. - Image models have per-model size floors/caps (Seedream needs 1920+; `GEN_SIZE=2048`, do not lower; gpt-5-image-mini caps lower). `generate_image` applies model-specific sizing; concept generation defaults to `--request-size 1536`. diff --git a/TODO.md b/TODO.md index ec9d924..41d967e 100644 --- a/TODO.md +++ b/TODO.md @@ -82,12 +82,14 @@ baseline sheet. ADR) indicated; do not rebuild on the warped base.** - [-] Skin the Quaternius mesh and verify Idle, Walk, seated and arm-down poses. The old MPFB/arm-retarget warps are not a reference; judge the Quaternius result directly. - (Direction set: ADR-0018 option 2 — 62-joint runtime. `NpcAvatar` now maps the Quaternius - names with old-rig fallback and derives proxy pivots from `get_bone_global_rest` - (commit `0cd12af`). First end-to-end capture loads and runs, but the vision judge reads - the arms/legs as misaligned — the `_sync_skeleton` swing axis (`Vector3.RIGHT`) is - calibrated for the old rig, not the Quaternius bone roll. Next: determine the per-bone - swing axis for UpperArm/LowerArm/UpperLeg/LowerLeg from the Quaternius rest basis.) + (Direction set: ADR-0018 option 2 — 62-joint runtime. `NpcAvatar` maps the Quaternius + names + derives proxy pivots from `get_bone_global_rest` (commits `271f10a`/`0cd12af`). + Two blockers remain: (1) the arm-down GLB's **skinning** renders A-pose in Godot even + though its rest is arm-down — the `armature_apply` + `export_apply=True` bake writes + wrong inverse bind matrices, so fix the Blender export first; (2) `_pose_bone` uses + `rest * Quaternion(axis, angle)`, which only cancels when `rest² = identity` (the old rig's + 180° rest); the Quaternius ~76° rest does not, so the pose formula must be derived from the + actual `set_bone_pose_rotation` semantics for a non-180° rest.) - [ ] Retarget Idle and Walk from the 24 Quaternius clips to the contract rig; discard combat, gun and sword clips. Verify looping, foot contact and frame rate in Godot. (Direction set: no retarget needed — the clips are authored for the 62-joint rig; only