Role-table version 2: bind the upper chest by the model's chain (MOT-O12) - #25
Merged
Merged
Conversation
…O12) Both local models that have 上半身3 chain 上半身 -> 上半身3 -> 上半身2 -> 首. Version 1 bound 上半身2 as chest and 上半身3 as upperChest. The shared retarget drops a joint a target does not bind. It does not fold that joint into its child (RETARGETING_POLICY 4.1, case 6). Reordering the two bones therefore does not help on a target without an upper chest. Under version 1 the neck carried 上半身2's key twice; the reordered table drops that key instead. Both leave the arms up to 25 degrees off. Version 2 binds the two bones differently on each side. - As a target, they bind in the model's own chain order. Where 上半身3 is off the neck's chain, it binds nothing. - As a source, upperChest is never emitted. chest is the bone the neck hangs from, and its world rotation already holds the torso below it. Over the local corpus, arms from those models now stay within 2.5 degrees of the ground truth on every target, as every other pair does. The MOTION_CONTRACT section 12.2 heading drops "version 1", so the links to its anchor are updated. MOT-O12 moves to the resolved questions, backed by a new dated report. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #24. It opens against that branch, so this diff shows only role-table version 2. Merge #24 first.
Summary
This PR resolves MOT-O12. In both local models that have
上半身3, the chain is上半身→上半身3→上半身2→首. Role-table version 1 bound上半身2aschestand上半身3asupperChest, which is the opposite order.Ordering the two bones by the chain is not enough. The shared retarget drops a joint the target does not bind, rather than folding it into its child (
usd-motion-pluginsRETARGETING_POLICY §4.1, case 6). On a target without上半身3, both orders leave the arms up to 25° off:上半身2's key twice;上半身2's key is dropped.Version 2 (
kRoleTableVersion= 2) binds the two bones differently on each side:上半身2and上半身3bindchestandupperChestin the model's own chain order. Where上半身3is off the neck's chain, it binds nothing.upperChestis never emitted.chestis the bone the neck hangs from, and its evaluated world rotation already holds every torso rotation below it. This is the second role, afterhips, that a source and a target bind differently.Measured over 17 local characters (motion C, PMX onto PMX, identity rests; median / largest p95 / max):
Motion C's figures now equal motion A's.
Changes
mmdSkeletonAdapter:OrderUpperBodysets the target order andSourceUpperBodybuilds the source roles; the version is bumped. Unit tests cover the conventional order, the inserted order and the off-chain case.check_installed_consumer.py: now expectsroleTable=2.docs/reports/2026-09-25-phase9-upper-chest.md;Test plan
ctest --preset windows-release: 32 of 32 pass, includingworkspace_installed_consumerwithroleTable=2.python scripts/check_docs.pypasses.🤖 Generated with Claude Code