poi’s tech blog

3D多人数同時接続型球体アクション成人向けゲーム開発のためのアイデア、ナレッジ

BlenderモデルをUnityにインポートしたときの座標系の値とかのまとめと解決策

Blender 2.79b
Unity 2017.1.5f1

BlenderからFBX出力したモデルをUnityのSceneに配置したときRotationとかScaleがバグるやつについてまとめた。

問題

UnityにFBX取り込むとメッシュ(Body)とアーマチュア(Root)オブジェクトのRotationとScaleが意図しない値になる。

f:id:poipoipoip:20190501213815p:plain

f:id:poipoipoip:20190501213820p:plain

前提知識

light11.hatenadiary.com

回転がおかしくなる理由は少し複雑です。

まずUnityとBlenderでは座標系が異なります。
UnityはY軸を上方向とする左手座標系なのに対して、BlenderはZ軸を上方向とする右手座標系です。

そのため、BlenderからUnityにモデルを持って行く際には回転させて軸を合わせてくれるのですが、
この結果として回転値が入ってしまいます。

qiita.com

スケールに関してはBlenderがfbxに出力するときにメートルとcmの変換がかかるらしい。

この問題を上手いこと解決するのです。

Blender

アウトライナーの構成

f:id:poipoipoip:20190501175832p:plain

いろいろあるけど以下だけ覚えればOK

  • Body      Meshオブジェクト
  • Root      Armatureオブジェクト

モデルのTransform値

位置
X: 0cm
Y: 0cm
Z: 17.468cm (高さ0の地点に足が接地したときのオブジェクトの原点の位置)

回転
X: 0°
Y: 0°
Z: 0°

拡大
X: 1.0
Y: 1.0
Z: 1.0

寸法(公式設定よりちょっと大きめにした)
X: 45.12cm
Y: 30.027cm
Z: 32.457cm

f:id:poipoipoip:20190501174615p:plain

このモデルを以下のFBX出力オプションで出力してUnity上で見る。

f:id:poipoipoip:20190501180046j:plain

  • デフォルト出力
  • スケールを適用の「すべてFBX」を適用
  • 「!実験的機能!トランスフォーム適用」を適用
  • 上記2つを適用

UnityでTransform値を確認する

f:id:poipoipoip:20190501175540p:plain
あれ、32cmってかなりちっちゃくね…

FBXを取り込みHierarchyに配置すると以下の構造になる。

f:id:poipoipoip:20190501180116p:plain

unity_kirby_default Prefabオブジェクト
└┬Body      Meshオブジェクト
 └Root      Armatureオブジェクト

それぞれのTransform, Rotation, Scaleを見てみる。

Prefabオブジェクトの値は全部同じなので割愛

f:id:poipoipoip:20190501180253p:plain

  • デフォルト出力

f:id:poipoipoip:20190501180300p:plain

f:id:poipoipoip:20190501180307p:plain

  • スケールを適用の「すべてFBX」を適用

f:id:poipoipoip:20190501180501p:plain

f:id:poipoipoip:20190501180508p:plain

  • 「!実験的機能!トランスフォーム適用」を適用

f:id:poipoipoip:20190501180756p:plain

f:id:poipoipoip:20190501180803p:plain

  • 上記2つを適用

f:id:poipoipoip:20190501180838p:plain

f:id:poipoipoip:20190501180845p:plain

BodyのRotationとRootのScaleが理想的なのは2つとも適用した時やね。

RootのScale 0.0777 って何?

ArmatureのScaleミスっててオワタ。

このScaleを1.0にするとすべてのアニメーションの位置の値が高いままだから全部のキーフレームに0.078掛けないと直らん。。。つらたん。

f:id:poipoipoip:20190501181308p:plain

あとRootのX軸に-90°が設定されてるのが直らない。

これはBlender側のArmatureにオブジェクトモードでX軸に90°足して編集モードで-90°足せばいいのかな?

f:id:poipoipoip:20190501181907p:plain

UnityのRootのX軸は0°になったけど案の定アニメーションがバグった。

f:id:poipoipoip:20190501181923p:plain

あーつらたん。

まとめ(教訓)

BlenderモデルをUnityで使うときにX軸意識するために90°掛けて~」
「モデルのScale100倍にして~」
「Unityにインポートするためにモデルは寝かした状態で~」
「出力オプションが色々あって~」

煩わしいんじゃい!!

  • Blender上ではモデルの向きは自然でOK
+X方向:モデルの右手がある方向
-X方向:モデルの左手がある方向
+Y方向:モデルの後ろ
-Y方向:モデルの正面
+Z方向:上
-Z方向:下

テンキーの1押したときにモデルがこう見えればOK

f:id:poipoipoip:20190501210054j:plain

  • メッシュオブジェクト

 そのまま作ってOK。

 RotationのXYZは0°、Scaleは1.0になるようしておく。
 (3Dビューでオブジェクトモードの時のNキー押したとき出てくる値のこと)

  • Armatureオブジェクト

 Scaleは1.0で。

 ボーンを作る前に空っぽのArmatureをオブジェクトモードからRotation Xに90°足して以下の値にしておく。
 X: 90°
 Y: 0°
 Z: 0°

 その後ボーンを作ると楽。

 すでにボーンを作ってしまっていた場合、
  1. オブジェクトモードからRotation X軸に90°足す
  2. 編集モードですべてのボーンを選択後-90°足して+Y方向が上の状態に戻せばOK

  • アニメーション

上のArmatureの設定したあとにアニメーション作ること!!!!!

おじさんとの約束だからね!!!!!!!!!!!

じゃないとUnity上でX軸に-90°掛かったまま頑張るか、Blender側で修正しようとしてもアニメーションがバグるよ!!!!!!

  • 出力設定

FBXで出力する。

スケールを適用の「すべてFBX」と「!実験的機能!トランスフォーム適用」を適用するのを忘れずに。

以上!!!!!!QED!!!!!!証明完了!!!!!(やけくそ)

作りこんだアニメーション全部作り直しなのか・・・・・・・・・・・・・・・???
















まるっと解決したので追記

Armatureオブジェクトの回転X軸に90°が設定できず(無理に設定するとアニメーションが崩壊する)に詰んだ諸君。

以下のアドオンを入れると幸せになれるぞ…

https://forum.unity.com/threads/blender-unity-rotation-fix.181870/

アドオンの入れ方と使い方を簡単に解説。

1,リンク先から$Unity Tools 265 and newer.zipを入手して解凍する

f:id:poipoipoip:20190501201931p:plain

2,blenderの情報ビューからファイル>ユーザー設定を開く

f:id:poipoipoip:20190501200942p:plain

3,アドオンタブを開き、ファイルからアドオンをインストールを選択

f:id:poipoipoip:20190501200959p:plain

4,ダウンロードしてきたUnity_tools.pyを選らんでファイルからアドオンをインストールを選択

f:id:poipoipoip:20190501201025p:plain

5,Object: Unity Toolsタイトルの隣のチェックボックスを有効にしてユーザー設定の保存を選択

f:id:poipoipoip:20190501201105p:plain

6,3Dビューでオブジェクトモードにした状態でArmatureオブジェクトを選択しておく

7,3DビューでTキーを押してメニューを出し、MiscのUnity ToolsからSimple rotation fixを選択

f:id:poipoipoip:20190501201155p:plain

すると回転のX軸に90°が設定されるよ!!!!!!

この方法でやるとアニメーションも問題なく動く!!!!!神!!!!!

FBX出力オプションは上と同じで、スケールを適用の「すべてFBX」と「!実験的機能!トランスフォーム適用」を適用しておけばOK!!!!!!!!!!!!!

f:id:poipoipoip:20190501203251p:plain

最後にUnityにインポートするううううううううううううううううううううう

f:id:poipoipoip:20190501202728p:plain

f:id:poipoipoip:20190501202734p:plain

完全勝利!!!!!!

…?

RootオブジェクトのPosition Zなに…

コピペして数値見たら「4.092726e-11」

ゴミみたいな小さい値が含まれるの仕様?

BlenderのArmatureオブジェクトの位置Y軸は0m(座標変換されてUnity上Z軸?のはず)って表示されてたけど値が小さすぎて0m表示になってたっぽい。

トランスフォームパネルから位置Y軸に0入れてもう一回エクスポートしたら直った。

f:id:poipoipoip:20190501203543p:plain

よかった、これで解決ですね