You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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).
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.
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
Up to 256 bones. Skinning is still capped at 96 (src/ae3d/skin/module.ae:42, MAX_BONES = 96, and the matching limit in src/ae3d/gltf/module.ae). Lift the cap through the skin palette and the GPU skinning paths, and test it with a figure of more than 96 joints.
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.
Activity
nicolas-maman commentedon Oct 22, 2026
Handoff, 2026-10-22: what this milestone starts from.
ual1_rigify.glb, see M0 ground truth: a real human in CI (Quaternius mannequins, UAL clips), motion metrics, a viewer #854).physics.humanoid_schemereads it as -1. The UE-named build of UAL1 is an FBX (Unreal Engine/AL_Standard.fbxin the same zip), and ae3d has no FBX importer. So the first retarget is Rigify to UE5 by name, on near-identical proportions:<Style>_<FW|FR|BW|BR|SW|SR|ID|TR1..3>.bvh, trimmed byFrame_Cuts.csv.Mirroring, clip events, BVH capture and a retargeter that keeps the f…
Root motion through a character controller, sealed loops, sampling co…
Captures as clips: a root made under the hips, root lock, straighteni…
Animation pipeline docs: motion capture, events, loops, mirrors, reta…
Free the character controllers the capsule test and the showcase make (…
Heads aligned by the bone coming into them; the showcase's figure on …
nicolas-maman commentedon Nov 1, 2026
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.Missing
src/ae3d/skin/module.ae:42,MAX_BONES = 96, and the matching limit insrc/ae3d/gltf/module.ae). Lift the cap through the skin palette and the GPU skinning paths, and test it with a figure of more than 96 joints.Done when a figure of more than 96 bones skins correctly, measured in a test.
nicolas-maman commentedon Nov 2, 2026
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.
ikrig: a look turns and nods within a neck's limits; fingers a captur…