Copyright 2025 Nick Porcino
Humanoid skeletons are named and structured differently by nearly every tool that uses them, which makes moving characters and animation between content creation, game, and virtual-world pipelines harder than it should be.
The Reference Canonical Skeletal Framework (RCSF) surveys the major skeletal formats and defines a canonical set of joints that each format maps onto. The aim is a clear, well-documented pivot for translating between formats — not a new universal skeleton that everyone is expected to adopt. Format-specific choices are preserved; RCSF just provides the common reference in the middle.
survey.md- Per-format analysis of the surveyed skeletal standards (OpenUSD, VRM, HAnim, SMPL-X, BVH, ASF/AMC, Mixamo, UE Mannequin, Unity Mecanim, and others)joints.csv- The mapping table: each canonical joint alongside its equivalent in every surveyed formatproposal.md- Draft proposal for the Metaverse Standards Forumreferences.md- Primary information sources for each of the studied formatsREADME.md- This overview documentskels/- The mapping table exploded into one human-editable TOML file per skeleton, plus_canonical.toml(the pivot defining joint and column order). This is the source you edit;joints.csvis regenerated from it. See Editing the Mapping.split_csv.py,join_csv.py,rcsf.py- Small dependency-free tools that explodejoints.csvintoskels/and stitch it back, verifying the round-trip is lossless.
joints.csv is a wide table (one row per canonical joint, one column per
skeleton), which grows unwieldy to review in a pull request. To keep edits
small and reviewable, the table is kept exploded under skels/:
skels/
_canonical.toml # the pivot: canonical joint order + column order (edit to add rows/columns)
OpenUSD.toml # one file per skeleton: canonical joint -> that format's joint name
VRM.toml # ("-" means the format has no equivalent for that joint)
... #
ANNY.toml #
skels/ is the source of truth; joints.csv is a generated artifact. You
edit the small TOML files, then regenerate the CSV. The tooling is pure Python
3.11+ (stdlib only — no pip install), and every regeneration verifies the
round-trip is byte-exact, so nothing is ever silently lost.
Two commands cover everything:
python3 join_csv.py # CHECK: does skels/ still reproduce joints.csv? (exits non-zero on drift)
python3 join_csv.py --write # APPLY: regenerate joints.csv from skels/, printing every changed cellThe --write change summary is the safety net: it lists exactly which cells
moved (e.g. [HAnim] LeftHand: 'hand_l' -> 'l_radiocarpal'), so an accidental
off-by-one or wrong-column edit is obvious before you commit.
-
Fix or refresh one skeleton's joint names Edit its
skels/<Skeleton>.toml, thenpython3 join_csv.py --writeand review the printed diff. Commit the.tomland the regeneratedjoints.csvtogether. -
Add a new skeleton (a new column)
- Create
skels/<Name>.tomlwith askeleton = "<Name>"line and a[values]table mapping every canonical joint to that format's name ("-"where none). - Append
"<Name>"to theskeletonslist inskels/_canonical.toml(its position sets the column order). python3 join_csv.py --write.
- Create
-
Add a new canonical joint (a new row)
- Insert the joint name into the
jointslist inskels/_canonical.tomlat the correct hierarchy position (this sets row order). - Add that same key to the
[values]table of everyskels/*.toml. python3 join_csv.py --write. (join_csv.pyerrors clearly if any skeleton file is missing the new joint, so you can't half-add a row.)
- Insert the joint name into the
-
Rebuild
skels/from scratch (e.g. after editingjoints.csvdirectly)python3 split_csv.pyre-explodes the CSV intoskels/; follow withpython3 join_csv.pyto confirm they agree.
Because each skeleton lives in its own file, a PR that touches one format shows
a clean, self-contained diff — and python3 join_csv.py in CI will fail if
joints.csv and skels/ ever fall out of sync.
- OpenUSD - Pixar Universal Scene Description skeletal framework
- VRM - VRoid humanoid avatar specification
- HAnim - Web3D Consortium humanoid animation standard
- SMPL-X - Statistical Multi-Person Linear model eXpressive
- BVH - Biovision Hierarchy motion capture format
- ASF/AMC - Acclaim motion capture format
- Mixamo - Adobe automated animation service
- UE Mannequin - Unreal Engine reference skeleton
- Unity Mecanim - Unity semantic humanoid system
- Godot - Godot Engine SkeletonProfileHumanoid
- Second Life - Linden Lab Bento and legacy skeletons
- Roblox - R15 Reference Skeleton
- Momentum Humanoid Rig - Meta SAM3D Body Skeleton
- ANNY - NAVER Labs differentiable parametric body model (MakeHuman-derived "anny" rig)
- CSV-to-mapping-algorithm converter
- Joint hierarchy validation tool
- Cross-format conversion engine
- Anatomical consistency validator
- Animation quality assessment framework
- Performance benchmarking suite
- Community validation platform
- Reference implementation library
- Locate primary SMPL-X academic publications and implementation repositories
- Find original BVH format specifications and comprehensive documentation
- Locate CMU ASF/AMC format documentation and motion capture database references
- Find Adobe Mixamo technical documentation and API specifications
- Locate Epic Games UE Mannequin skeletal system documentation
- Find Unity Mecanim Humanoid Animation system technical documentation
- Verify and update all reference links for accuracy and completeness
- How should twist bones be handled in minimal target formats?
- Resolved: incorporate description into the main text.
- Diagrams would be good to incorporate.
- A twist joint (sometimes called a roll or twist bone) is a helper joint inserted along a limb — usually the upper arm, forearm, thigh, or calf — to distribute rotational deformation (especially twisting around the bone’s primary axis) more naturally across the mesh. ${Twist}{Rotation} = {Parent}{Rotation} * {Twist}_{Weight}$
- Should facial expression joints use standardized blendshape names?
- Resolved: In future development, we could provide guidance on how the face joints (which are pseudo-skin/muscle clusters) that they map in some manner to FACS. Specifying FACS is out of scope, but referencing it canonically is in scope. Facial expressions in general are going to be a combination of joints and blendshapes. Breaking out expressions as a future topic seems like a strong direction.
- What constitutes acceptable quality loss during downward conversion?
- What validation metrics best assess cross-format conversion quality?
- Should there be performance tiers for different hardware capabilities?
- Resolved: An avatar can use a cluster geometry for hierarchy (like a suit of armor), or it can be skin-cluster weighted.
- We can describe common techniques as informative text.
- Skeletal LODs define subsets of bones.
- The hierarchy definition can show how Skeletal subsets map to the canonical hierarchy. We could provide guidance as to common methods for delegating functionality to articulation schemes within the same hierarchy.
- How do we handle proprietary engine-specific features (Animation Blueprints, etc.)?
- How should the framework accommodate emerging standards (VR haptics, AI-driven animation)?
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. You are free to share and adapt this material for any purpose, even commercially, under the following terms:
- Attribution - You must give appropriate credit and indicate if changes were made
- ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license
This license promotes collaborative development while ensuring that improvements benefit the broader community working on humanoid skeletal interoperability challenges.