2020/09/17
Maya&Blender<骨の互換性>
こんにちは、BACKBONEの塙です。
今回はBlenderに関する記事となります。
当スタジオでは、Blenderの研究開発を少しずつ進めておりますが、
先ずはJointについて、MayaからBlenderへ転送した際の検証結果をご紹介したいと思います。
まだ検証中でもあるので、内容に不備や間違いなどがあるかもしれません。
現時点で当スタジオが把握している内容、としてご確認いただけますと幸いです。
以前、Maya&3dsMax<骨の互換性>という記事も載せておりますので、
ご興味のある方は併せてご覧ください。
検証するアトリビュートは前回と同様で下表となります。
検証環境は「Maya2018 SP6、Blender 2.81」、
転送方法は「Export Selection (FBX export)」を使用しました。
0.準備(BlenderにFBXデータをExport / Import)
MayaのJointデータをFBXでExportします。
Blender側で、Import設定は特に変更せず、下図の設定でImportしてみます。
下図のような結果となりました。
この結果は良くなさそうです。
Blenderのヘルプを確認してみるとImportに関連する項目がありました。
そちらを参考に、下図の設定で再度Importを試してみました。
結果は下図のようになり、見た目上は問題無さそうです。
ただ、Jointの軸を確認してみると、
MayaではX軸が子のJointを向くように設定していましたが、BlenderではY軸に変更されています。
Blenderで作業が完結すれば問題ないと思いますが、
MayaからJointやアニメーションを流用したい場合などに不安が残ります。
アニメーションデータをExport/Importして確認してみました。
こちらのMayaのアニメーションデータをExportして、
BlenderにImportしてみました。
どうやらアニメーションも無事転送出来ているようです。
1.Rotate Order ※画像は左側がMaya、右側がBlenderです。
Maya側で全てのJointのRotate Orderを「yzx」に変更した上で、
簡易のアニメーションデータを設定し転送を試してみました。
アニメーションは同じ結果で転送されましたが、
Blender側でRotate Orderのアトリビュートが存在しないため、
回転順序のアトリビュートの値は転送することが出来ませんでした。
BlenderにはModeという項目が存在しているので、こちらで回転順序の変更は可能のようです。
アニメーションが設定されているJointのRotate Orderを変更した場合、
アニメーションの結果が変わります。
その場合でも同じ結果となるのか、念のため確認してみます。
上記のMayaデータの全てのJointのRotate Orderを「xyz」に変更し、転送してみます。
アニメーション設定後のRotate Orderの変更も問題なく転送出来るようです。
次に、xyz以外の全てのパターン(yzx、zxy、xzy、yxz、zyx)で確認してみましたが、
「zxy」「xzy」「zyx」のみ、leg_jt_Lだけ上手く転送出来ておらず、
下図のような結果になりました。
一見するとleg_jt_LのZ軸が180°反転しているように見えますが、
Roll回転に相当する軸にも値が入っており、単純なZ軸の反転ではなさそうです。
この現象について、現時点では原因不明なため、引き続き調査してみます。
2.Rotate Axis
Blender側でRotate Axisのアトリビュートが存在しないため、転送することが出来ませんでした。
また、Mayaと同じ結果にはならず、逆方向に向くという結果となりました。
3.Degree of Freedom(以下DOF)
Blender側でDOFのアトリビュートが存在しないため、転送することが出来ませんでした。
BlenderにはMayaのDOFと同様の機能が存在していましたが、
MayaからのDOFの設定は反映されないようです。
4.Stiffness
Blender側でStiffnessのアトリビュートは存在していましたが、転送することが出来ませんでした。
5.Preferred Angle
Blender側でPreferred Angleのアトリビュートが存在しないため、
転送することが出来ませんでした。
6.Joint Orient
① Rotateの値は0で、Joint Orientだけに値が設定されている場合
Blender側でJoint Orientのアトリビュートが存在しないため
(※存在するかもしれませんが現時点では確認できておりません)、
転送することが出来ませんでしたが、見た目は同じ状態で転送されました。
また、Importした時点でRotationの値は0に設定されていました。
Joint Orientの値はどこに格納されているのでしょうか。。。
後述する内容に被りますが、Maya側でRotateに値を設定して転送すると、
Blender側ではRotateの値は0に設定されているにもかかわらず、
見た目は同じ状態で転送されました。
Maya側で1フレームと30フレームにRotateのアニメーションを設定したデータでも確認しましたが、同様の結果でした。
Gragh EditorのF-Curveで確認すると、1フレーム目の初期値は0になっており30フレーム目で値が変化しています。
1フレーム目以降のアニメーションは、1フレーム目からの相対値に変換されているように見えます。
現時点ではこれ以上の検証が行えておりませんので、引き続き、
BlenderにJoint Orientに相当するアトリビュートが存在するか、
またImport時にどのような変換が行われているか、について調査してみます。
② Rotate、Joint Orientに値が設定されている場合
RotateとJoint Orientの値が合算され、見た目は同じ状態で転送されました。
また、①と同様にImportした時点でRotationの値は0に設定されていました。
7.Inverse Scale
① Mayaでinverse Scaleがコネクションされている場合
Maya側でleg_jt_Lに、Scale X=2、Scale Y=3、Scale Z=5を設定し、
lowLeg_jt_LのInverse ScaleのXYZにそれぞれ2、3、5の値が設定された状態で試してみましたが、
Blender側でinverse Scaleのアトリビュートが存在しないため、転送することが出来ませんでした。
親のスケールを継承する結果となりましたので、
親に不均一スケールが設定されていた場合はシアーが発生します。
Blender側でInherit Scaleの設定を「None」に変更すれば、親のスケールを相殺する事は可能のようです。
② Mayaでinverse Scaleのコネクションを外した場合
コネクションに関係なく①と同様に、転送することが出来ませんでした。
8.Segment Scale Compensate(以下SSC)
① MayaでSSCがOnの場合
Blender側でSSCのアトリビュートが存在しないため、転送することが出来ませんでした。
Inverse Scaleの①の検証と同じ結果になりました。
② MayaでSSCがOffの場合
上記と同じ結果になりました。
9.Shear
FBX形式ではShearの値は出力できないため、転送することが出来ませんでした。
10.Inherits Transform
Blender側でInherits Transformのアトリビュートが存在しないため、
転送することが出来ませんでした。
Blender側にはInherit RotationとInherit Scaleが存在していますが、機能性は異なるようです。
まとめ
検証は以上となります。
上記の検証結果をまとめますと、下表のようになりました。
今回の記事がBlenderを使用する案件などで、何かしらのお役に立てれば幸いです。
今後は、引き続きBlenderの検証を行いつつ、Blenderでのリグ開発も進めようと思います。
ではまた。
※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。