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)にする方法を検証します。
(少しトリッキーなやり方です)
検証環境
- Blender 3.4.0
- Unity 2021.3.14f1
テストシーンに関して
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、メッシュともに回転の値をゼロにした状態となりました。