この記事はBlender Advent Calendar 2018 - Adventarに参加しています。本日は5日目。
前回はsakura🌸(@sakura_rtd)さんのBlender | プロシージャルマテリアル解説動画はじめました - Road to 3DCGでした。
BlenderとUnityでの制作にもだいぶ慣れてきたので,BlenderでUnity向けにFBXをエクスポートについてまとめます。
アーマチュア(ボーン)やアニメーションまでは含めず,今回はメッシュだけをエクスポートする時の話に絞っています。その他の話も近いうちにまとめようと思っているので,RSSをチェックしておいてもらえると嬉しいです。
- 追記(2019/04/29)
- アーマチュア(ボーン)についてもまとめました。
- BlenderでUnity向けにFBXをエクスポート:アーマチュア(ボーン)編
はじめに
主に気をつけるのは「単位」「座標系の違い」「インポートできる内容」「最終出力の把握」です。
実際のワークフローに近い順を追いながら詳細を書いていきます。作業の流れは以下の通り。使用バージョンは2.79bです。
- 制作前に注意すること
- 制作で気にかけること
- エクスポート前の確認
- エクスポートの設定
制作前に注意すること
単位をメートルにする
BlenderとUnityの単位は,1ユニット=1メートルで同一ですが,「プロパティ」の「シーン」から単位を明示的にしたほうが良いです。Unityへインポートした時,File Scaleに微量の端数が出ることがあります。
単位の設定はメートルのままでもOKですが,アニメーションの精度を高くしたいなら倍数を0.01
に設定して,1ユニット=1センチメートル,あるいはそれ以下にします。
単位は,絶対に後から変更しないほうが良いです。特にIKアニメーションなどをつけた後だと修正がとても困難です。個人・チームプロジェクトに関係なく,初期から一貫した設定をしておくのがおすすめです。
+Y軸をオブジェクトの正面として扱う
BlenderとUnityの座標系の違いとエクスポートの仕様が相まって,エクスポートするFBXの座標系をUnityと完全に合わせることはできないです(詳細は後述)。この差を吸収するには,通常Blenderでは[-Y方向]を正面として扱いますが,便宜上[+Y方向]を正面としてデータを制作しておきます。
- 追記(2019/02/02)
- この項は,Unityの正面を勘違いしたことによるものでした。この対応を行う必要はありません。
制作で気にかけること
同一オブジェクトを複製する場合はリンクを使う
単にオブジェクトを複製すると,同一の形状であるにも関わらず無駄に個別のメッシュが増えてしまいます。
Unityに限らず注意しておきたい点です。メッシュの数が描画負荷に関わってくるので,同一の形状であるならリンクで複製して,同じメッシュデータとしておくのが望ましいです。
シェーディングの混在は辺を分割する
Unityでシェーディングにフラットとスムースを混在させるには,辺を分割して表現します。シャープと辺分離のモディファイアーを使い,エクスポートの時に分割(適用)すれば管理で苦労することはありません。
UVマップは1つ
Unityで独自のシェーダーでも使用しない限りは,UVマップは1つにします。利用できないわけではないですが,Unityの標準的なシェーダー(Standard.shader)も2つ目のUVマップをメインで利用することは想定されていません。
ポリゴンごとにマッピングを変えたい場合は,マテリアルを複数設定して割り当てるのが良いと思います。
マテリアルはUnityで設定する
Blenderでマテリアルを設定しても,ほとんどの項目はUnityにインポートされません(ディフューズカラーがアルベドカラーとして設定される程度)。前述の通り,ポリゴンごとに割り当てるマテリアルを設定すれば十分かと思います。
エクスポートされる頂点,ポリゴン数を把握しておく
モディファイアーは,最終的に適用された状態でエクスポートされます。再分割曲面やべベルなど,サブディビジョン・サーフェスでしかモデリングを経験していないと最終的な頂点,ポリゴン数を勘違いしがちです。
また,インポートする時にポリゴンはすべて三角面化されます。トポロジーに拘りが無いならエクスポートやインポートの時の自動処理にまかせれば十分です。そうでないなら,自分で分割しておくか,三角面化のモディファイアーで管理するのがおすすめです。
モディファイアーは,都度適用しなくても設定で適用後の数値を確認することができるので,思うほど管理コストは高くないです。
エクスポート前の確認
複数のマテリアルを設定した時は頂点ソートに注意する
Unityにインポートするメッシュのマテリアルの順序は,頂点のソート順によって決められています。FBXをエクスポートする前には,エディットモードに入って頂点を選択し,「メッシュ要素をソート」で自分の意図したソート順にしておくのが望ましいです。
以前この内容について書いたので,詳しい方法は以下の記事を参照してみてください。
Unityのマテリアルリストの順序をBlenderで制御する
ただ,この方法では解決しないというケースも見かけました。上記で無理だった場合は,下記のリンク先も参照してみてください。
Blenderで作成した3DモデルをUnityに取り込む その4 - MRが楽しい
トランスフォームの値を確認する
エクスポートに限った話ではないですが,オブジェクトモードでのトランスフォームの値が意図したものか確認します。
単体でオブジェクトをエクスポートする時,ほとんどの場合は,位置/回転/拡大縮小はすべて初期化された状態が望ましいでしょう。
エクスポートの設定
設定の内容は上記の画像の通りです。今回はメッシュのみなので,エンプティやカメラなど,余計な項目はすべてトグルをオフにしてあります。以降,大事な項目だけ詳細を説明していきたいと思います。
単位の情報を追加
「スケーリング(拡大縮小)」の値を[1]のまま右端にあるトグルボタンをオンにします(最近のバージョンはこれがデフォルト値でしょうか?)。
このトグルボタンをオンにすると,シーンタブで設定した単位の情報がエクスポートされるFBXに追加されます。「スケールを適用」の項目は[全ローカル]のままでOKです[FBX単位スケール]に変更します。
- 追記(2019/04/29)
- 単位の設定を行なっていない場合,アーマチュアを含めたエクスポートで,スケール100をかけられてしまうので,[FBX単位スケール]を基本として扱うのが無難そう
座標系の変換
BlenderとUnityでは向きだけではなく,基準となる座標軸の系統も異なります。
- Blender
- 右手系Z-up(Y Forward)
- Unity
- 左手系Y-up(Z Forward)
座標系を変換するには,「前方」と「上」で回転を設定して,さらに「!実験的機能!トランスフォームの適用」を使用します。ただ,右手と左手をどう回転させても向きが一致しないのと同じく,Unityの座標軸の値を設定しても,向きを一致させることができません。
そこで「前」を[-Zが前方]とすることで辻褄を合わせます。「上」はそのまま揃うので[Yが上]に設定し,「!実験的機能!トランスフォームの適用」を[オン]にします。これでインポートした時にトランスフォームの回転に余計な値が入らず,ゲームオブジェクトがUnityの正面(-Z軸方向)を向く状態にできます。
- 追記(2019/02/02)
- Unityの正面は,+Z軸方向です
ジオメトリタブの設定確認
モディファイアーを自身で適用していない場合は,ジオメトリタブの設定「モディファイアーを適用」「モディファイアーのレンダー設定を使用」がオンになっているか確認します。
おわりに
Blenderでいい感じにFBXをエクスポートする手順を探るのは,なかなか大変でした。アーマチュア(ボーン)が絡むともっと大変(というかいい感じにはならない……)。
- 追記(2019/04/29)
- アーマチュア(ボーン)についてもまとめました。
- BlenderでUnity向けにFBXをエクスポート:アーマチュア(ボーン)編
BlenderでのFBXエクスポートは,ライセンスの関係上で公式のSDKを使用していません。イレギュラーなワークフローになるのはしょうがないです。今後もこの状況は変わらないと思うので,正式なSDKを使用したエクスポーターを搭載したソフトを使用できる場合,そちらを軸に制作するのがおすすめです。
今後に期待したい点として,glTFというファイル形式があります。Blenderは2.8,Unityは2019.nで使用できるようになる予定です。ライセンス上も問題ないので,ワークフローを乱さずに済むかもしれません。そうなればBlenderではFBXではなく,glTFでのエクスポートが主流になるかもしれませんね。
Blender Advent Calendar 2018 - Adventarは,まだ空いている箇所があるのでお時間ある方は是非参加を!
次回は6日目,MITSUDA Tetsuo(@lab1092)さんで2.79 to 2.80Beta 移行メモ | まんださんちです。