2024/08/16
3dsMax/Maya/Blenderの末端骨の挙動を比較してみた
こんにちは。
BACKBONEの塙です。
本記事では、各DCCツールで「末端の骨」を動かした際の挙動が異なる事象に焦点を当てたいと思います。
今回は、3dsMax、Maya、Blenderで検証データを作成しました。
呼び方は様々ございますが、末端の骨は下図の赤丸部分であるという認識で話を進めます。
◆検証データの構造について
3dsMax、Maya、Blenderで作成したデータは、全て同じ構造になっています。
- 8角形のシリンダーオブジェクトを作成
- 親:Bone001、子:Bone002
- Bone001でシリンダーが動くようにスキンウェイトを設定
- Bone002にスキンウェイトは設定しない
◆骨の挙動を確認
3dsMax、Maya、Blenderで骨の挙動を確認します。
以降のGIF動画は全て下記の手順で制御しています。
2.Bone001を回転で制御
3.Bone001を移動で制御
4.Bone002をスケールで制御
5.Bone002を回転で制御
6.Bone002を移動で制御
▹3dsMax
3dsMaxの骨の挙動を確認します。
注目すべきはBone002を移動で制御しようとした時です。
Bone002は、
・Bone001とBone002の距離を維持するように移動する
・親であるBone001が回転する
といった結果が得られました。
実際にBone001のRotate値を確認したところ、Rotate値は変動していました。
▹Maya
Mayaの骨の挙動を確認します。
Bone002は、
・Bone001とBone002の距離を維持せずに、任意の方向に移動する
・Bone001には影響しない
といった結果が得られました。
▹Blender
Blenderの骨の挙動を確認します。
Bone002は、
・移動せずに向きだけが変化する
・Bone001には影響しない
といった結果が得られました。
実際にBone002のRotate値を確認したところ、Rotate値は変動していました。
◆末端の骨を「自由な方向に移動」制御できるようにしてみる
上記で末端の骨の基本的な挙動が把握できました。
それでは、階層はそのままでBone002を自由な方向に移動制御する事は可能か、について試してみます。
▹3dsMax
デフォルトの状態で、Bone002を自由な方向に移動制御できるプロパティがないかを探してみましたが見つけることができませんでした。自由な方向に移動制御すべく、Bone002の位置にポイントヘルパー(Mayaではロケーター、Blenderではエンプティに該当)を作成し、Bone002をポイントヘルパーにコンストレイントで拘束して自由な方向に移動制御できる仕組みを再現してみました。
興味深いのは、Bone002を移動制御した際にシリンダーも伸縮している点です。
Bone001のScale値が変動しているように見えますが、
確認してみるとScaleのWorld値もLocal値も初期値のままでした。
試しに伸縮方向(図ではX軸に該当)のScale値を変更してみたところ、
・伸縮方向(図ではX軸に該当)のScale値は変化するがビュー上では骨、形状共に反映されない
といった結果が得られました。
MAXScriptでも確認しましたが同様の結果でした。
▹Maya
すでにBone002を自由な方向に移動制御できているので割愛します。
▹Blender
Boneプロパティの「Connected」のチェックを外すことで移動させることが出来ました。
「Connected」がOFFの状態でもBone001との親子関係は保たれるようです。
Bone002を移動させても、Bone001への影響はありませんでした。
◆同じ挙動の再現
上述のとおり、3dsMaxでは、Bone002を移動制御すると親のBone001のRotate値が変動しバインドしている形状にも影響します。MayaとBlenderでも、3dsMaxと同じ挙動を再現できるかを試してみます。
▹3dsMax
こちらを目指す挙動結果とします。
・親の骨は伸縮する
・親の骨は回転する
▹Maya
Bone002の位置にロケーターを作成し、aimConstraintを使用してBone001が常にロケーターを向くように設定します。次に、distanceBetweenノードなどを使用してBone001とロケーターの距離を測り、距離の変化をBone001のScaleに接続します。
上記の方法で3dsMaxと同じ挙動が再現できました。
▹Blender
Bone002の位置にエンプティ(3dsMaxではポイントヘルパー、Mayaではロケーターに該当)を作成し、Bone001にStretchToConstraintを使用してエンプティをターゲットに指定します。
上記の方法で3dsMaxと同じ挙動が再現できました。
◆まとめ
DCCツール毎に内部処理は少々異なりますが、Maya、Blenderともに3dsMaxと同様の挙動が再現できたかと思います。各DCCツール間でRigデータを簡単に渡すことはできませんが「目指す挙動を明確にする」、「DCCツール特有の機能を使用しない等のルールを決める」など、工夫次第では他にも同じ挙動を再現できる事があるかもしれません。弊社でも3dsMaxとMayaを両方使用する、また両方で同じリグの再現が必要といった案件が幾つかございましたが、今回ご紹介した方法や色々な工夫を加えることで乗り越える事ができました。ぜひ試してみてください。
いつか他のDCCツールへとRigデータを橋渡ししてくれるツールが開発されるといいですね。
ではまた。
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。