Blender事始め – No.25(FBXエクスポートまとめ)

対象バージョン:Blender v2.82a、Unity v2019.4.1f1

BlenderでEXPORTしたFBXデータ

今回やりたい事は、Blenderで作成し、Unityでインポートして利用したいメッシュデータをFBXファイル(.fbx)でエクスポートする際の方法について記載します。

座標軸のおさらい

BlenderとUnityでは座標軸が異なります。

各軸の方向が異なるのは見ての通りです。

また、ここでは、前後左右を上記の様に定義します。(新しいシーンの作成時にデフォルトで配置されるカメラを向く方向を正面・前となる様にしまた。)

利用するデータ

今回は、前後左右を分かりやすくするために、以下の様なデータを作成しました。

※このデータにはArmatureは設定されていません。(Armatureが設定されているとまた、挙動が変わってきます…)

BlenderでEXPORT

とりあえず、デフォルトの設定でこのデータをEXPORTしてみます。
(カメラ・照明・エンプティ―オブジェクトは除いておきます)

Forward(前)は「-Z Forward」、Up(上)は「Y Up」なので、Unityの座標系と合っていそうです。

UnityにImport

Projectビュー(Assets)での表示

[Import New Assets]でインポートすると下記の様に表示されます。

何か、倒れていますね…

Hierarchyビューに追加した際のSceneビューでの表示

とりあえず、AssetsからHierarchyビューにDrag&Dropして、Sceneビューに表示させてみます。

むむむ、上下は正常になりましたが、前後が逆になってしまいましたね…。

InspectorビューのTransformのRotationを見ると、X軸周りに約-90度回転されていますね…。

また、Scaleも100倍になっています。(表示サイズは問題なさそうです)

また、ScriptからInstantiate()メソッドを使って実体を生成した場合は、以下の様になってしまいます。

今度は下面が前を向いてしまいました。Instantiate()で角度設定を(0,0,0)にしたためでしょうね…。

何か使いにくい…

デフォルト設定のままでは、なんだか使いにくいですね…

Scaleが1じゃない

例えば、Box Colliderなどを設定する場合に、Sizeを設定する場合、このScale値を考慮しないといけなくなります。

Rotationが(0, 0, 0)じゃない

先ほどの例にあるように、Instantiate()で実体化しようとする時に、傾きを考慮する必要が出てきてしまいます。

対策方法

Unity側での対策

BlenderでのEXPORTの設定は変更せずに、まずはUnity側で対応する方法を記載します。

(Armatureありのデータを読み込んだ際は、前後の向きを除いて自動で以下の様な状態になります)

GameObject(Empty)の作成

Hierarchyビューで[Create Empty]を実行し、GameObjectを作成し、名前を適切なものに変更します。

以下では、「directional_cube」に名前を変更しています。

Importしたデータを作成したGameObjectのChildに設定

ProjectビューからHierarchyビューにインポートしたデータをDrag&Dropし、GameObject(Empty)のChildに設定します。

また、前後の向きを合わせるために、Rotation(Y)に「180」を入力します。

作成したGameObjectをPrefab化

HierarchyビューからProjectビューへDrag&Dropし、Prefab化します。

Projectビューの中の表示が正常になりました。

Hierarchyビューのオブジェクトは一旦削除しておきます。

動作確認

Hierarchyビューに直接配置した場合も、Instantiate()メソッドで実体化した場合も正しく(思った方向に)向きが揃いました。

また、Rotationが(0, 0, 0)、Scaleが(1, 1, 1)となりました。

気になる点

ほぼ、思い通りの動作にはなりましたが、Box Colliderなどを設定する場合に、自動で大きさが設定されないので、手動で合わせる必要があります。

Blender側での対策

Unity側であまりごちゃごちゃと触りたくないという場合は、以下の方法を用います。

(各パラメータの組み合わせは多数ありますが、自分が最も良いと思ったものになります)

EXPORT時のパラメータ設定

EXPORTダイアログでのTransformパラメータを下記の様に設定します。

Apply Scalings

このパラメータを「FBX All」に変更します。これで、ScaleパラメータがFBX向けの物に変換され、UnityでIMPORTした時にScaleが(1,1,1)になります。

Forward

このパラメータを「Z Forward」にします。

自分では、納得いかないのですが、これを「Z Forward」にしても、前後逆になるのですが、Rotation(Y)に180が設定されるので、Instantiate()時は正常な向きになります。

!EXPERIMENTAL! Apply Transform

「Transformの変更を適用する」オプションにチェックを入れておきます。

前に「!EXPERIMENTAL!」(実験的)とあるように、正式にサポートされている機能ではなく、うまく行かないリスクは自分自身で負ってくださいとの事です。(私も責任は持てません…)

Unity側での表示

上記の設定でEXPORTしたデータを、Unity側でIMPORTすると下記の様になります。

上下方向は問題なさそうです。

Hierarchyビューに配置してみると、以下の様になります。

前後は逆になっていますが、Rotation(Y)が180度になっています。

Scaleは(1, 1, 1)ですね。

Rotation(Y)を「0」にすれば、思い通りの表示になります。

※「それなら、EXPORT時に「-Z Forward」にすれば…」と思いましたが、前後逆で、Rotation(Y)= 0になってしまい、うまく行きませんでした。

Prefab化

Rotation(Y)= 0にした状態で、HierarchyビューからProjectビューにDrag&DropしてPrefab化します。

Prefab化する場合、下記の様なダイアログが表示されます。

元のIMPORTしたデータとは独立したPrefabにしたい場合は、「Original Prefab」を、IMPORTしたデータから継承したPrefabにしたい場合は、「Prefab Variant」を選択してください。(違いについての説明は省略します)

今回は、「Original Prefab」を選択しました。

こうする事で、Rotationが(0, 0, 0)、Scaleが(1, 1, 1)にできました。

また、Hierarchyビューで作成したデータは不要なので削除しておきます。
(IMPORTしたデータは、必要となるので残しておきます)

動作確認

Prefab化したデータを使って、動作確認します。

これで、問題は無さそうです。

Armature付きデータの場合

以前作成した「Qちゃん」の場合を、少し見直してみます。

デフォルト設定でEXPORT

TransformパラメータはデフォルトのままでEXPORTします。

UnityでIMPORT

以前〔No.19(Unityで動かす①)〕でUnityにIMPORTした時と同様に、Armature付きのデータでは、上下はあっている様です。

データの確認

IMPORTしたデータを、HierarchyビューにDrag&Dropすると、以下の様になります。

GameObjectの子としてmetarig(Armature)とQ-chan(Mesh-Data)が配置されています。

Meshデータを見ると、RotationとScaleは以下の様になっています。

これは、前述の「対策方法-Unity側での対策」と同じ状態ですね。

さて、Qちゃんを前に向かせたいのですが、Meshデータ(Q-chan)側のRotationを変更しても、前を向いてくれません。

Armature付きのデータでは、MeshデータはArmatureに追従するように設定されているためです。

そのため、metarig(Armature)側のRottion(Y)を「180」にして、前を向かせてから、Prefab化します。

Armature付きのデータでは、この構造は変わらないので、前述の「Blender側での対策」をやってもあまり意味はありません。(Meshデータのパラメータが気持ち悪いという場合は、パラメータを変更しても問題はないとおもいますが…)


前の記事次の記事
No.24(トラブルシューティング①)No.26(3Dプリンターの導入)