Maya&Blender<骨の互換性>

2020/09/17

こんにちは、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してみました。

どうやらアニメーションも無事転送出来ているようです。

 

 


1Rotate 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でのリグ開発も進めようと思います。
ではまた。

 

※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。