Skip to content

M1 skeleton, pose, clips, retargeting and root motion (L0, L1) #855

Description

@nicolas-maman

Part of #853. L0 and L1: skeleton, pose, clips, retargeting, root motion.

Build:

  • skeleton: bones, parents and rest pose, with a humanoid map to one canonical rig (UE5 mannequin names) and up to 256 bones. Lift skinning's 96-bone cap.
  • pose: per-bone local transforms in flat arrays; local and model space; blend, additive difference and apply, mirror.
  • clip: glTF imported into skeleton-indexed tracks with a sampling cursor; a separate root track; events; contact and sync markers found at import.
  • retarget: chain retargeting between rigs (Unreal IK Retargeter style): rest-pose alignment, chain scaling, pelvis height, feet and hands kept on their contacts. UAL1's Rigify rig and 100STYLE's BVH (CC BY 4.0, with credit to Ian Mason) onto the UE5 mannequin.
  • Root motion: the root track moves the capsule, or is held in place for in-place use.

Demo: the same walk, run and idle on three rigs, root motion carrying the capsule.

Held to:

  • bone directions within 2 degrees of the source after retargeting;
  • toe skating under 5 mm per stance at walk and run;
  • no drift or snap at a clip's loop;
  • a measured sampling cost per character.

Folds in #342 (re-scoped to the engine-side retargeter).

Activity

  1. nicolas-maman commented on Oct 22, 2026

    @nicolas-maman
    CollaboratorAuthor

    Handoff, 2026-10-22: what this milestone starts from.

    • UAL1's locomotion clips need a name map. UAL1's walk, jog, sprint and idle clips exist only on a Rigify-named rig in glTF (ual1_rigify.glb, see M0 ground truth: a real human in CI (Quaternius mannequins, UAL clips), motion metrics, a viewer #854). physics.humanoid_scheme reads it as -1. The UE-named build of UAL1 is an FBX (Unreal Engine/AL_Standard.fbx in the same zip), and ae3d has no FBX importer. So the first retarget is Rigify to UE5 by name, on near-identical proportions:
      • DEF-hips to pelvis; DEF-spine.001/.002/.003 to spine_01/02/03; DEF-neck to neck_01; DEF-head to Head;
      • DEF-shoulder.L to clavicle_l; DEF-upper_arm.L to upperarm_l; DEF-forearm.L to lowerarm_l; DEF-hand.L to hand_l; the fingers by name;
      • DEF-thigh.L to thigh_l; DEF-shin.L to calf_l; DEF-foot.L to foot_l; DEF-toe.L to ball_l;
      • root to root.
      • The rest poses differ, so it is a real retarget (rest-pose alignment), not a rename.
    • Captured locomotion: 100STYLE, the original BVH, https://zenodo.org/record/8127870 or https://www.ianxmason.com/100style/. It is CC BY 4.0: credit "The 100STYLE Dataset - Ian Mason" wherever it ships.
      • A 28-bone skeleton rooted at Hips, 60 fps.
      • Files are <Style>_<FW|FR|BW|BR|SW|SR|ID|TR1..3>.bvh, trimmed by Frame_Cuts.csv.
      • It needs a BVH importer (none exists) and the chain retargeter onto the UE5 mannequin.
      • Commit only a few retargeted clips if any, with the attribution.
    • Skinning's MAX_BONES is 96 (skin/module.ae:42). The mannequins' 65 joints fit; a UE5 Manny-size skeleton would not.
  2. nicolas-maman commented on Nov 1, 2026

    @nicolas-maman
    CollaboratorAuthor

    Reopened: #891's merge (6fda12b) closed this before its list was met. The remaining work is below.

    On main, with its numbers (test_anim_pipeline)

    • pose, clips (glTF and BVH into skeleton-indexed tracks, root track, events, contact markers), retarget (rest-pose alignment, chain scaling, feet kept on their contacts), and root motion.
    • 100STYLE onto the UE5 mannequin: every bone within 1.6° of the source (bound 2°).
    • With the feet kept, a planted toe slides under 10⁻¹¹ mm a stance (bound 5 mm).
    • A loop's seam: 2·10⁻⁶°. Root motion: 4.9914 of 4.9914 m.
    • Sampling a 53-joint take: 0.32 µs.

    Missing

    Done when a figure of more than 96 bones skins correctly, measured in a test.

  3. nicolas-maman commented on Nov 2, 2026

    @nicolas-maman
    CollaboratorAuthor

    Reopened: #905's merge (68934a3) closed this, but it carried only the hand-off between writers (animator.pause, resume, share_take, safe behaviour removal). The remaining work is as written above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions