feat(hand-poses): canonical hand-pose library, pre-ship staging for ariki-game

Four Kevin-harvested poses (flat/relaxed/fist/grip) as glTF node-local quats
on the canonical Quaternius skeleton. pose_flat shipped to the runtime
HandPoseLayer 2026-08-17 and verified in the dance bed; fist/grip staged,
blocked on the Lena finger-weight repair.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 14:53:20 -07:00
parent 84eef7a5a2
commit 9ac741302e
5 changed files with 1018 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# Hand poses — pre-ship staging for ariki-game
Canonical hand-pose library. Poses live here first; when a pose is adopted for the
game it is **copied** to `ariki-game/assets/quaternius/hand-poses/` (keep the two
byte-identical — the runtime `HandPoseLayer` reads the game copy).
## Format
`{"bones": {"<bone_name>": [x, y, z, w], ...}}` — glTF node-local quaternions on the
**canonical Quaternius skeleton**, which is exactly Godot bone-pose space for these
bodies. Apply directly:
```csharp
skeleton.SetBonePoseRotation(skeleton.FindBone(name), new Quaternion(x, y, z, w));
```
40 bones per pose, including `*_04_leaf_*` tip bones. Some bodies lack the leaf
bones — **skip bones `FindBone` returns -1 for**, never error. On non-canonical rigs
(Mako) poses must be applied rest-relative; the runtime layer simply excludes those
bodies instead.
## Poses
| File | Source (Kevin packs) | Runtime status |
|---|---|---|
| `pose_flat.json` | harvested flat hand | **SHIPPED to layer 2026-08-17** — verified in the dance bed on exp01 |
| `pose_relaxed.json` | `HandWave01` f0 | staged |
| `pose_fist.json` | `AttackPunch01_R/L` f7, merged | blocked on Lena finger-weight repair (fist/grip shred on exp01exp04) |
| `pose_grip.json` | `CombatIdle1H01` f0, both hands | blocked, same repair |
## Verification (before shipping a pose)
- `tools/handpose_bake_preview.py body.glb pose.json out.glb` — bake into rest rotations.
- `tools/skin_displacement_check.py posed.glb original.glb` — Godot-exact LBS travel;
cm-scale = sane, m-scale = broken. **Blind to fin tearing** — pair it with the
edge-stretch check (`tools/edge_stretch.py`).
- `tools/handpose_skin_to_obj.py` + `tools/handpose_render_objs.py` — the only honest
visual check. Never judge by importing a baked-pose GLB into Blender (false shards).