reorg(characters): ship-time folders — lena_base_v01 ships, lane moves to work/lena
REGISTRY rewritten around the central rule: a character folder is born only when a body ships to ariki-game (<character>_base_v<NN> = ship ordinal). lena_nude dissolves accordingly: - characters/female/lena_base_v01/ — SHIPPED 2026-08-10: AccuRig GLB carrier, T-pose/rig FBX + JSON, previews, frozen README - characters/work/lena/ — the live lane: recipes 01-47 (incl. new 36-47: refill/sheets/clay/despeckle/musculature/spin/AccuRig export/graft/pose QC), masters (athletic_v04 blend + textures, accurig blend), lane-history README - hires_claude/hires_work intermediates (blends, logs, probes) pruned Supporting docs: AGENTS.md, working-files rule, rig-graft plan addendum, originals README, prune_lane.py. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -66,14 +66,50 @@ Census facts that shape the plan:
|
||||
3. **AccuRig** (manual, Jeremy/Ozlem): rig the bait FBX. Export rigged FBX.
|
||||
4. **Graft** (headless Blender): import rigged bait FBX + pristine GLB; snap rest
|
||||
poses; transfer skeleton + skin weights decimated→full-res by nearest-surface
|
||||
with tight max-distance; **hands get special handling** (per-finger masked
|
||||
transfer or reduced distance + limit-totals + normalize) — this is where the
|
||||
old hand mangling gets fixed. Export GLB: original mesh + original packed
|
||||
with tight max-distance. Export GLB: original mesh + original packed
|
||||
textures + new rig. FBX artifacts are discarded.
|
||||
**Hands are no longer part of this step — see "Hands" below.**
|
||||
5. **QC**: pose sweep incl. finger curls; then (if/when destined for game) the
|
||||
existing AccuRig→Quaternius conversion (`ariki-game/tools/make_male_ib_quatskin_accurig.py`
|
||||
lineage) picks it up.
|
||||
|
||||
## Hands: transplanted, not solved (RESOLVED 2026-08-07)
|
||||
|
||||
The hands come off the bait entirely and are transplanted from a body that already
|
||||
ships working ones — `tools/graft_hands.py`, wrist-aligned. Three measurements
|
||||
decided this:
|
||||
|
||||
- **There is nothing to solve.** The nude lane never touched the hands: hand-region
|
||||
displacement from the Tripo original is mean **0.010 mm**, p50 exactly 0.000, only
|
||||
0.06% beyond 1 mm (the 12.6% vertex churn there is micron jitter from the v03
|
||||
despeckle pass). A donor's hand weights fit this mesh as-is.
|
||||
- **A mitten rig would cost real animation.** Fingers move *relative to each other*
|
||||
by up to **89°** over a clip (fertility 89.4°, taming 77.6°, nd_01 46.7°,
|
||||
canoedismount 26.4°); only `war_dance_01` and `hakadance1_static` hold them still.
|
||||
So four of six dances would visibly flatten. Rejected.
|
||||
- **The bone list is not negotiable anyway.** 40 of the 65 joints are hands, every
|
||||
clip carries tracks for all 40, and `tools/verify_body_variant.py` gates on "65
|
||||
joints in identical order". A mitten could only ever have been a *skinning* choice.
|
||||
|
||||
`graft_hands.py` edits the glTF node graph directly rather than round-tripping the
|
||||
armature through Blender, because Blender re-derives bone rest orientation from
|
||||
edit-bone head/tail — the exact failure `ariki-game/tools/rig_pose_gate.py` exists to
|
||||
catch. Validated: two self-tests (identity, and a 0.55× + 7° similarity) place every
|
||||
hand joint to **5e-16 u** and recover 100% of donor weights; output passes
|
||||
`verify_body_variant.py`; and `rig_pose_gate.py` reports **max error 0.000° over 260
|
||||
(bone, clip, sample) comparisons** under the two most finger-heavy dances.
|
||||
|
||||
Two self-inflicted bugs the similarity test caught, worth not re-introducing: the
|
||||
wrist scale gets applied **twice** if you compose the target's wrist matrix without
|
||||
stripping its own scale first (the forearm ratio was measured in that same scaled
|
||||
space), and the weight transfer must convert donor-local → world → target-local, not
|
||||
compare raw POSITION arrays across two files.
|
||||
|
||||
**Still open on hands:** if AccuRig returns no wrist joint at all once the hands are
|
||||
cut from the bait, `graft_hands.py` aborts — the `--wrist-from-forearm` fallback is
|
||||
specified but not implemented, because what AccuRig actually returns is unknown until
|
||||
step 3 runs.
|
||||
|
||||
## Naming + step 2 status (RESOLVED 2026-08-04, later same day)
|
||||
|
||||
Jeremy raised the hands budget and released the bait step. Built with
|
||||
|
||||
Reference in New Issue
Block a user