Found while curating the v6 motion library (epic #837 quality follow-up, PR #904).
Two families of corpus rigs extract with a per-bone axis inversion in --dump-canonical:
- Quaternius shared-armature characters (Alien, Animated Men/Women, Knight): the right upper arm's extracted direction has mean signed up-component +0.38..+0.67 during walk/run (arm points diagonally up) while the left hangs at −0.9. Retargeted, one arm renders skyward.
- Animated Astronaut (Sketchfab): the neck chain extracts pointing straight down (mean up-dot −1.00 across walk/idle/wave) — the retargeted head renders thrown back / buried in the torso.
The v6 library curation gates (signed per-arm hang check, neck-up check in build-motion-library-v5.py) DROP these takes, so the shipped library is clean — but the extraction itself is losing usable takes (~15% of locomotion takes dropped). Likely cause: the bind-geometry-derived direction (child-offset) picks a mis-parented or zero-length child on these armatures, or the calm-frame reference lands on a frame where the restWorld/restDir triple is inconsistent for that bone.
Fix idea: derive restDir per bone with a sanity pass — compare against the canonical T-pose expectation in the canonical frame and flip/re-derive when the sign disagrees at the reference frame (the same trick the canonicalizer uses for D_c), or fall back to the role's canonical direction when the child offset is degenerate.
Found while curating the v6 motion library (epic #837 quality follow-up, PR #904).
Two families of corpus rigs extract with a per-bone axis inversion in
--dump-canonical:The v6 library curation gates (signed per-arm hang check, neck-up check in
build-motion-library-v5.py) DROP these takes, so the shipped library is clean — but the extraction itself is losing usable takes (~15% of locomotion takes dropped). Likely cause: the bind-geometry-derived direction (child-offset) picks a mis-parented or zero-length child on these armatures, or the calm-frame reference lands on a frame where the restWorld/restDir triple is inconsistent for that bone.Fix idea: derive restDir per bone with a sanity pass — compare against the canonical T-pose expectation in the canonical frame and flip/re-derive when the sign disagrees at the reference frame (the same trick the canonicalizer uses for D_c), or fall back to the role's canonical direction when the child offset is degenerate.