BlenderからArmature付モデルをFbx出力をしてUnityで読み込む際に、スケールを1倍、回転を(0,0,0)にする方法

BlenderからArmature付モデルをFbxで出力してUnityで使用する場合、初期値でExportを行った場合、Armatureのルートとメッシュのルート、どちらのTransformも回転、スケールの値が入ってしまいます。

それでも大きな問題にはなりませんが、やはりスケールは1倍、回転は0度になっている方が、プログラムでのバグも少なくなります。

そこで、BlenderからArmature付モデルをFbx出力をしてUnityで読み込む際に、スケールを1倍、回転を(0,0,0)にする方法を検証します。

(少しトリッキーなやり方です)

検証環境

テストシーンに関して

MagicaVoxelで作成したモデルにArmatureが適用されています。

このMeshとArmatureをExportしてUnityで使用することを想定します。

Blenderの単位はメーターにしています。(Scene Properties -> Units -> Length -> Meter)

Armatureとモデルを選択した状態で、File->Export->Fbx(.fbx)を選択して実行します。

ExportOptionとしてLimits to Selected Objectsのチェックはオンの状態で行います。

Unityに読み込んだArmatureとMeshのトップノードのスケールを(1,1,1)にする方法

Apply Scalingの初期状態は、All Localになっています。この設定で出力したモデルをUnityの初期値で読み込んだ場合、読み込まれたデータは、ArmatureとMeshのトップノードのスケールに100の値が入った状態となります。

これをFbxUnitに変更した場合、スケールが1の状態になります。

この両者でUnity上のモデルの大きさは、同じままです。

(左 AllLocalで読み込んだ場合、右 FbxUnitで読み込んだ場合)

100倍の値を入れておくのは処理として気持ちのいいものではないため、FbxUnitにしえ読み込むのがいいように思われます。

Unityに読み込んだArmatureとMeshのトップノードの回転を(0,0,0)にする方法

BlenderとUnityは座標系が異なるため、通常のやり方では回転の値に何らかの数値が入ってしまいます。そのため、以下のやり方は多少トリッキーな方法になります。

UnityはZ軸正の方向がForward、Y-UPで定義された左手座標系です。(Blenderは右手座標系、Z-UP)

そのため、UP軸をまず合わせるためにメッシュとArmatureを回転し、Y-UPと同様の状態にします。(Armatureに対して-90度X軸回転)

この状態を初期値とするため、ApplyTransormを実施して、回転を0度にします。

(Objectモードで、object->apply->rotation)

次にExportを実施します。

この時にZ Forward Y Up としたうえで、ApplyTransformのオプションをONにします。

 

次にUnityで読み込みます。

この際、初期値から一つだけ変更があります。

Bake Axis ConversionのオプションをONにします。(Unity側のFbxインポートオプション)

Unity画面上に配置します。

この状態では、Armature側のRotationに値が入った状態になっているため、キャラクターが寝てしまっています。

Rotationの値をすべて0にするとZ-Forward Y-UPの状態で、Armature、メッシュともに回転の値をゼロにした状態となりました。

 





 

 

MagicaVoxelで作成したモデルをUnityで使用するまで

はじめに

MagicaVoxelで作成したモデルは、単純にExportしただけでは、Unityで使用するのに適した状態ではありません。理由としては、以下があげられます。

  • objとしてExportすると、UVがかなり特殊な形になっている
  • plyでExportするとポリゴン数が多くなりすぎる。また、カラーがVertexColorとして表現されており、Textureにはなっていない
  • どちらの形式で出力しても重なった頂点が存在する

これらの問題を解決するために、Blenderを使用して、Unityで使用しやすい形に変更する方法を検討しました。

続きを読む