Lane B / session-5 item 4: treaty amendment — required root_space sidecar field

motion.json sidecar gains REQUIRED root_space in {camera, world}. HSMR is
per-frame -> emits camera; Lane C reads it and derives a world root from foot
contacts for locomotion clips. PLAN treaty + Lane C task updated. v1 quality bar:
in-place clips first-class, traveling best-effort until a grounding pass exists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-17 10:02:53 +10:00
parent 0cf673aa82
commit 0e2f7d0c12

14
PLAN.md
View File

@ -51,8 +51,11 @@ critical path. Lanes EF are follow-ons. Do NOT start E/F before D ships.
- Skeleton: **mixamorig 65-joint** as defined by `~/Documents/character_kit`
(`female_game.glb` / male base). Canonical bone list generated in Lane 0.
- Intermediate motion format: **BVH at 30fps** + sidecar JSON
(`{fps, joint_order, root_trajectory, source_video, model, version}`).
BVH because Blender imports it natively and it's human-diffable.
(`{fps, joint_order, root_space, root_trajectory, source_video, model, version}`).
**`root_space` ∈ {`"camera"`, `"world"`} is REQUIRED** (session-5 amendment): HSMR is a
per-frame recoverer so it emits `"camera"`; Lane C reads this and, for locomotion clips,
derives a world root from foot contacts. BVH because Blender imports it natively and it's
human-diffable.
- Units metres, Y-up, character faces Z (three.js convention; Unreal yaw-fix happens
at UE import, as established in the A_3D_STORE experiments).
- Final artifact: FBX (anim-only, Mixamo-style "Without Skin") dropped into
@ -157,8 +160,11 @@ Tasks:
`mixamorig_` variants — this bit us before), bake to keyframes.
- Foot-contact fix: detect frames where foot velocity ≈ 0 & height < threshold IK
pin. `# ponytail: threshold heuristic, upgrade to learned contact detection in Lane E if it annoys`.
- Trim the T-pose bookends (Lane A protocol guarantees them), root-motion option
(in-place vs traveling) as a flag.
- Trim the T-pose bookends (Lane A protocol guarantees them). Root motion is driven by the
sidecar **`root_space`** (session-5 treaty): `"camera"` (HSMR) → in-place by default, or
derive a world root from foot contacts for traveling clips; a `--in-place`/`--traveling`
flag overrides. v1 quality bar: **in-place clips are first-class; traveling is best-effort**
until a proper grounding pass exists.
- Export anim-only FBX (Mixamo "Without Skin" style — merge_anims.py already eats these).
2. QC render: 3-second turntable mp4 of the clip on the female_game body, written next
to the FBX. **Verify with own eyes** (the rule) — every clip gets its mp4 looked at