ヒト型モデルには、世界共通の「人体部位の書き方」が一つあるわけではありません。
実際には、次の4層が重なっています。
-
ファイル形式:階層・座標・アニメーションをどう保存するか
-
骨格構造:どの骨がどの骨の子か
-
人体セマンティクス:その骨が「左上腕」「骨盤」など何を意味するか
-
命名規則:
LeftUpperArm、upper_arm.Lなど、実際の文字列
このうち、ファイル構造は厳密ですが、骨の名前は多くの場合、暗黙知や制作会社の規約です。VRMやUnity Humanoidのように、人体部位を明示的に規定する仕組みを重ねると、初めて意味まで標準化されます。
代表的な形式
| 形式 | 主な用途 | 厳密に決まるもの | 人体部位名 |
|---|
| FBX | Maya、Blender、Unityなどの受け渡し | ノード、骨格、スキン、アニメーション | 原則自由 |
| glTF/GLB | Web、ゲーム、リアルタイム表示 | ノード階層、関節配列、ウェイト、バインド行列 | 原則自由 |
| VRM | 人型アバター | glTF構造+人体ボーンの意味 | 規定あり |
| USD/UsdSkel | 映画・大規模制作パイプライン | Skeleton、Joint、Animation、Skin binding | 部位の意味は原則自由 |
| Unity Humanoid | リターゲティング | 人体部位へのマッピング | 規定あり |
| URDF | ロボット | link、joint、軸、可動範囲、質量 | 原則自由 |
| MJCF | MuJoCo物理シミュレーション | body、joint、geom、actuator、sensor | 原則自由 |
FBX
FBXは幅広い3Dデータ交換用の形式です。Autodeskも、Maya、3ds Max、MotionBuilderなどの間で3D資産を交換するための形式として位置づけています。人体専用ではないため、骨名をLeftArmにするかupper_arm.Lにするかは、作成者やツールの規約に依存します。
glTF/GLB
glTFでは、ノード階層、ローカル変換、スキンに使用する関節配列、逆バインド行列などが厳密に定義されています。関節は特別な骨オブジェクトではなく、通常のノードをskin.jointsから参照する形です。
しかし、ノードのnameは表示・アプリケーション利用向けの任意文字列であり、一意である保証さえありません。つまりLeftUpperArmと書く義務はありません。
VRM
VRMはglTFの上に、人型であるという意味情報を追加した形式です。
VRM 1.0では、少なくとも次のような人体スロットが定義されます。
これらには必須・任意の区別があります。したがってVRMでは、単に骨が存在するだけでなく、「このノードは左上腕である」というマッピングが必要です。
重要なのは、実際のノード名そのものが必ずleftUpperArmである必要はなく、VRMの左上腕スロットに正しく登録されていることです。
USD/UsdSkel
UsdSkelは、スケルトン、スキニングされたメッシュ、関節アニメーションをDCCツール間で交換するためのUSDスキーマです。関節順序、階層、バインド、アニメーションなどを扱えますが、「この関節は人体の左肘」という普遍的な人体辞書を強制するものではありません。
Unity Humanoid
Unity Humanoidはファイル形式ではなく、読み込んだ骨格を人体部位に割り当てる意味付けレイヤーです。
Unityは、
などをHumanBodyBonesとして厳密に列挙しています。指についてもLeftThumbProximalのような標準スロットがあります。
元のFBX内で骨がBip001_L_Armという名前でも、Unity上でLeftUpperArmに割り当てればHumanoidとして扱えます。
人体部位の名前はどこまで標準なのか
1. 解剖学的な語彙はかなり共通
よく使われる語はおおむね共通しています。
ただし、これは語彙として共通しているだけで、文字列の書式までは統一されていません。
同じ左上腕でも、次のような名前が存在します。
意味はほぼ同じですが、別の文字列です。
左右の書き方
代表的な方式は3種類あります。
接頭辞
接尾辞
名前空間付き
左右は原則として、画面を見ている人からではなく、キャラクター本人から見た左右です。
G1の命名規則
G1は人体リグというよりロボット記述なので、名前がより機械的です。
分解すると、
です。
なら、
となります。
G1のURDFでは、pelvisからleft_hip_pitch_jointを通ってleft_hip_pitch_linkへ接続され、その次にroll、yaw、kneeと続きます。これは人体部位だけでなく、機械的な回転軸まで名前に含める方式です。
CGリグなら、
程度で済ませるところを、ロボットでは、
のように、自由度ごとに分割します。
厳密さの段階
ファイル構文:厳密
JSON、XML、ノード番号、親子参照、行列の個数などは厳密です。
たとえばglTFでは、skin.jointsの順序とinverseBindMatricesの順序が一致しなければなりません。
親子構造:厳密
という接続関係はデータとして明示されます。
親のワールド変換と子のローカル変換を掛け合わせて、子のワールド位置を求めます。glTFでも、子のグローバル変換は親のグローバル変換と自身のローカル変換の積として定義されています。
人体としての意味:形式による
-
FBX単体:ほぼ暗黙
-
glTF単体:ほぼ暗黙
-
USD単体:パイプライン依存
-
VRM:明示的
-
Unity Humanoid:明示的
-
URDF:人体としての意味は基本的に命名者依存
実際の名前:多くは慣習
LeftUpperArmでなければならない、という世界共通規則はありません。
したがって、実務では名前だけで判定せず、
を組み合わせて判定します。
主な留意点
座標系
形式やソフトによって、上方向、前方向、右手系・左手系が異なります。
glTFは右手系で、+Yが上、+Zが前、距離単位はメートル、角度はラジアンです。
読み込み時に座標変換されると、左右反転、180度回転、巨大化・極小化などが起きます。
BoneとJointは同じではない
CGではboneが身体の区間を表すことがあります。
ロボットではjointが回転中心、linkが硬い部品です。
したがって、
と単純に一対一対応させると、少しずれます。
RootとHipsを分ける
よくある構造は、
です。
Rootはキャラクター全体の移動用、Hipsは身体の骨盤運動用です。これを同じノードにすると、歩行アニメーションの移動と腰の揺れを分離しにくくなります。
TポーズとAポーズ
同じ骨名でも、初期姿勢やボーン軸が違えば、アニメーションをそのまま移植できません。
リターゲティングでは、
-
初期姿勢
-
骨のローカル軸
-
手足の長さ
-
肩幅
-
骨盤高
-
バインド行列
が重要です。名前が一致するだけでは不十分です。
補助骨
実際のリグには人体部位以外も含まれます。
これらはVRMやUnityの基本人体スロットに割り当てられない場合があります。無理に人体ボーンとして扱わず、追加ノードとして保持します。
同名骨
glTFでは名前の一意性は保証されません。Boneという名前が複数存在することも仕様上可能です。プログラムで扱う場合は、名前だけではなくノード番号や完全な階層パスを使用した方が安全です。
実務向けの命名案
人型リグを自分で設計するなら、次の順序に統一すると読みやすくなります。
例:
CGリグなら、
ロボットなら、
が分かりやすいでしょう。
要するに、ファイル形式は骨格を厳密に保存するが、その骨が人体の何であるかは必ずしも保証しない。VRMやUnity Humanoidは、その空白を人体部位マッピングで埋める仕組みです。