TL;DR
Blender 側で FBX エクスポートの設定を
で書き出して、Unity 側で Bake Axis Conversion のチェックを付ける
はじめに
この記事は VR法人HIKKY Advent Calendar 2023 の9日目の記事です。昨日の記事は @m2wasabi さんの Webアプリケーションのシークレット管理のあれこれ でした。フロントとしても「あるある」となりました。明日の記事は @emadurandal さんのWebGPUの記事らしいです。
おはようございます。株式会社HIKKYでwebエンジニア1をやっています @called_D です。webの人らしく Rails・Vue連携の黒魔術の話を書こうとしていたのですが 黒魔術の反動で身を焼かれたので2 別のテーマを書きます。趣味CG勢なので、Blender と Unity と FBX の話を。
2023年も終わりに近づき、2022年3 の訪れが近いなか、いかがお過ごしでしょうか。来年を気持ちよく迎えるために、座標軸を完全に理解し、曖昧なまま使っていた Asset Creation Toolset4 との関係を見直すために記事を書きます。何をどう設定すれば Blender からエクスポートした FBX を Unity にインポートして、Transform が正しくなるか(2023年末版)というわけです。
始まりは 2023-03-31 のVRChat の Developer Update で、Unity2021対応が発表された頃に遡ります。
その日のうちに、どうやら来年3が来ると Blender - Unity 間の座標系のトラブルが解消 されるようだという話が Twitter(現X) 上で囁かれました。
かねてより、しーわんさんの記事 これができる人は信頼できる!|Cwan|pixivFANBOX のおかげで ACT4 に座標変換周りを丸投げしていた私は「(Unity2021が来たら試すか……)」という気持ちでいたのですが……
――Unity2021が来ない。 なんなら直接 Unity 2022 にするらしい。VRCクライアント本体は2022で動くようになったけれどSDKはまだらしい etc...
試さずじまいで年が暮れてしまうところ、アドベントカレンダーの記事を書く話が来たので久しぶりに5 Unity Hub を立ち上げて実験することにしました。
前提
- Blender 3.6 LTS
- 3.6.5 の Windows Portable (.zip) 版を使っています。
- (実は3週間前に 4.0 がリリースされていますが、対象読者のほとんどはバージョン3系を使っていると思うので割愛)
- Unity 2019.4.31f1
- VRChat SDK が要求するバージョンです
- Unity 2022.3.6f1
そもそも「前」ってどの方向?
「正しい」結果を定義するために、前と上をはっきりさせておきましょう。上はよく出てくるように Blender が Z-Up で Unity が Y-Up です。では前は?
Blender: -Y
View > Viewpoint > Front で -Y 方向から見ることになります
「前から見る」ようにすると -Y から見るようになりました
Unity: Z
Vector3.forward が Z 方向の単位ベクトルです
Vector3(0, 0, 1)
ということで、前と上を揃えるので、Blender で -Y 方向だったものが Unity で Z 方向になり、Blender で Z 方向だったものが Unity で Y 方向になれば正しいです。
実際 Transform がどう狂うのか確認し、正しい状態と照らし合わせる
実験計画
Blender からエクスポートした FBX を Unity で取り込み、Transform が正しくなることを目的とします
- Blender で普通に FBX Export をした場合
- ACTでエクスポートした場合
- Bake Axis Conversion を使う場合
を比較します。
また、Blender のエクスポート設定と Unity のインポート設定を Bake Axis Conversion 向けに調整します
(余談: Better FBX Importer & Exporter は持っていないので省きます)
テストモデル
テスト用のモデルを作ります
(私はアバターを作れないので Armature とアニメーションを持ったモデルは用意できませんでした。余裕があればレッサーモクリのモデルを足します)
- Blender での座標軸
- 長さは1にしておきます
- 「前」と「上」が分かりやすいようにするテキスト
- 系が反転してしまった場合の検出用に DNA 模型
Blender で普通に FBX Export をした場合
メニューから行う普通のExportで、よくあるトラブルを再現してみます
Blender の Export FBX のデフォルト設定
Apply Scaling: All Local
Forward: -Z Forward
Up: Y Up
☑ Apply Unit
☑ Use Space Transform
☐ Apply Transform
(ここから、一応 Selected Objects の☑を付けます)
Top が上にあり、Front が Unity の Z 方向を向いているので一見うまくいったように見えますが、子オブジェクトの回転がおかしかったり、Scale が 100 倍になっており後々面倒なことになります。
(横にある Cube は (1, 1, 1) の座標に Scale 0.1 で置いてあるものです。カメラに近いので大きく見えますね……)
ACTでエクスポートした場合
ACTのエクスポート設定
この実験のために Blender 3.6用バージョン (2023.1) を入れたら、Target Engine: Unity
が Unity (Legacy)
にリネームされていました
親オブジェクトも子オブジェクトも変な回転がかからず Scale も 1 です。いつもありがとうございます
Unity 2020以降での実験
Blender 側での設定をデフォルト(トラブルが起きる状態)にしたままインポートして、 Bake Axis Conversion のチェックを付けてみます
前が後ろになってしまいました。また、画像には写っていませんが子オブジェクトのスケールが100倍になったままです。
Bake Axis Conversion を使う場合
どうやらこうするといいらしい、という情報6に従い、
Apply Scaling: FBX All
Forward: -Y Forward
Up: Z Up
☑ Apply Unit
☐ Use Space Transform
☐ Apply Transform
と設定します。
-Y が前方、Z が上ということで、#そもそも前ってどの方向? で確認した通りの Blender の座標系そのまま出すという設定ですね。
やりました! どうやらこうするといいらしい、に従っただけで煮えきらないですが Front が Z 方向になり、Transform も正しくなりました。
おわりに
何も分からず ACT を使っていたのが、何も分からず Blender と Unity の設定を触るのに変わっただけな気がしますが、ひとまず求める結果が出たので深追いしないことにします。
(ここから先は全部のチェックボックスを付けたり外したりして表を作ったり、仕様が非公開な FBX について、Blender の Export の実装詳細を調べたり、英語の情報をチェリーピックして翻訳する羽目になりそうな気がしているので……)
元記事と日本語で呟いてくださった @namaeWatashino さん6 に感謝して結びの言葉とします。
余談:
Armature の軸に関する追加の設定は https://polynook.com/learn/how-to-export-models-from-blender-to-unity を参照してください
Asset Creation Toolset は Import/Export Tools 以外にも便利な機能をたくさん持っているのでお別れする必要はないです。また、これまでの Target Engine: Unity (Legacy) で出力した FBX は、Unity 2020 以降でも Bake Axis Conversion のチェックを付けずにそのまま使えます。
また、本記事とは逆に Unity から FBX をエクスポートして Blender に取り込む場合は FBX Exporter パッケージ で、Binary モードで出してください(Blender は ASCII 形式に対応していないので)
-
(web屋、という曖昧な語感のほうが好き) ↩
-
書こうとしていたテクニックを上手く適用できないパターンで傷を負ったり、背景を説明すると色々アレだったりしたため。言うほど黒魔術ではないので安心してください ↩
-
https://github.com/mrven/Blender-Asset-Creation-Toolset ↩ ↩2
-
VRChat Creator Companion (VCC) があるため、直接 Unity Hub を触る機会はあまりない ↩
-
https://twitter.com/namaeWatashino/status/1621502136340340737; 孫引きになるので原典も貼ると
https://polynook.com/learn/how-to-export-models-from-blender-to-unity ↩ ↩2