2023年末版のFBXエクスポート設定

# TL;DR
Blender 側で FBX エクスポートの設定を

![Bake Axis Conversion 前提の設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/ccfea16c-3426-55b2-7ab2-b5ede169665d.png)

で書き出して、Unity 側で **Bake Axis Conversion** のチェックを付ける

# はじめに
この記事は [VR法人HIKKY Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hikky) の9日目の記事です。昨日の記事は @m2wasabi さんの [Webアプリケーションのシークレット管理のあれこれ](https://qiita.com/m2wasabi/items/64fe0521e46c4f4560e9) でした。フロントとしても「あるある」となりました。明日の記事は @emadurandal さんのWebGPUの記事らしいです。

おはようございます。株式会社HIKKYでwebエンジニア[^5]をやっています @called_D です。webの人らしく Rails・Vue連携の黒魔術の話を書こうとしていたのですが ~~黒魔術の反動で身を焼かれたので[^6]~~ 別のテーマを書きます。趣味CG勢なので、Blender と Unity と FBX の話を。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/883c7456-5fa5-4b95-568e-4ab28b7e05e5.png" alt="本体.png" title="本体.png" width="30%" />

2023年も終わりに近づき、2022年[^1] の訪れが近いなか、いかがお過ごしでしょうか。来年を気持ちよく迎えるために、座標軸を完全に理解し、曖昧なまま使っていた Asset Creation Toolset[^2] との関係を見直すために記事を書きます。何をどう設定すれば Blender からエクスポートした FBX を Unity にインポートして、Transform が正しくなるか（2023年末版）というわけです。

始まりは 2023-03-31 のVRChat の Developer Update で、Unity2021対応が発表された頃に遡ります。

https://vr-lifemagazine.com/vrchat-dev-20230330/

https://twitter.com/xlwnya/status/1641644056064442368

https://twitter.com/0ne_chan/status/1641744565274300416

その日のうちに、どうやら来年[^1]が来ると **Blender - Unity 間の座標系のトラブルが解消** されるようだという話が Twitter(現X) 上で囁かれました。

かねてより、しーわんさんの記事 [これができる人は信頼できる！｜Cwan｜pixivFANBOX](https://abcwan.fanbox.cc/posts/3648966) のおかげで ACT[^2] に座標変換周りを丸投げしていた私は「（Unity2021が来たら試すか……）」という気持ちでいたのですが……

――**Unity2021が来ない。** なんなら直接 Unity 2022 にするらしい。VRCクライアント本体は2022で動くようになったけれどSDKはまだらしい etc...

試さずじまいで年が暮れてしまうところ、アドベントカレンダーの記事を書く話が来たので久しぶりに[^3] Unity Hub を立ち上げて実験することにしました。

[^1]: VRChat の要求する Unity のバージョンに基づく年
[^2]: https://github.com/mrven/Blender-Asset-Creation-Toolset
[^3]: VRChat Creator Companion (VCC) があるため、直接 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
  - VRChat が動いている現在のバージョンです
  - このバージョン対応のVRCSDKは ~~2023-12-07 現在リリースされていませんが、そのうち来るものとして~~ このバージョンを対象に実験します
    + ~~記事公開日の早朝(JST) にSDKベータが来ました。~~
      * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/09740acb-e9b6-a3b4-ab54-ac8eeb737871.png" width="100px" alt="宇宙猫レッサーモクリ" title="宇宙レッサーモクリ" /> もうLiveになっとるが？？？ （おなじみの爆速リリース） 


## そもそも「前」ってどの方向？
「正しい」結果を定義するために、前と上をはっきりさせておきましょう。上はよく出てくるように Blender が Z-Up で Unity が Y-Up です。では前は？

### Blender: -Y
View > Viewpoint > Front で -Y 方向から見ることになります
![View ▶ front (F1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/7cdb3ee4-3868-96e2-e9b9-6491c3db017d.png)
![-Y 方向から見ている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/8deb9ed1-6469-c066-56be-1b5e14678bcf.png)
「前から見る」ようにすると -Y から見るようになりました

### Unity: Z
[Vector3.forward](https://docs.unity3d.com/ja/2020.3/ScriptReference/Vector3-forward.html) が 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](https://blendermarket.com/products/better-fbx-importer--exporter) は持っていないので省きます）

### テストモデル
テスト用のモデルを作ります
（私はアバターを作れないので Armature とアニメーションを持ったモデルは用意できませんでした。余裕があればレッサーモクリのモデルを足します）

* Blender での座標軸
  - 長さは1にしておきます
* 「前」と「上」が分かりやすいようにするテキスト
* 系が反転してしまった場合の検出用に DNA 模型

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/124cb6da-6fd7-f8b4-ea44-0547bb93b00e.png)

## Blender で普通に FBX Export をした場合
メニューから行う普通のExportで、よくあるトラブルを再現してみます

![File > Export > FBX](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/875352d0-aaf8-ca9f-c1db-c5592f16ba28.png)

<details><summary>Blender の Export FBX のデフォルト設定</summary>

Apply Scaling: All Local
Forward: -Z Forward
Up: Y Up
☑ Apply Unit
☑ Use Space Transform
☐ Apply Transform

![Blender の Export FBX のデフォルト設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/ef9b4824-e03f-90d9-7cff-c7b48fa07488.png)

（ここから、一応 Selected Objects の☑を付けます）
</details>

![スケールの数値が100](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/5eb637c7-877c-e328-ec2b-475fb3bee12d.png)

Top が上にあり、Front が Unity の Z 方向を向いているので一見うまくいったように見えますが、子オブジェクトの回転がおかしかったり、Scale が 100 倍になっており後々面倒なことになります。

（横にある Cube は (1, 1, 1) の座標に Scale 0.1 で置いてあるものです。カメラに近いので大きく見えますね……）

## ACTでエクスポートした場合

<details><summary>ACTのエクスポート設定</summary>

![Import/Export Tools](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/b48ca556-a025-7288-9abc-e65175143393.png)

:::note warn
この実験のために Blender 3.6用バージョン (2023.1) を入れたら、Target Engine: `Unity` が `Unity (Legacy)` にリネームされていました
:::

</details>

![ACTの場合。Transformが正しく (0, 0, 0) の (1, 1, 1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/3aeb89f7-ce32-fdf7-7933-a79600d9e953.png)

親オブジェクトも子オブジェクトも変な回転がかからず Scale も 1 です。いつもありがとうございます

## Unity 2020以降での実験
Blender 側での設定をデフォルト（トラブルが起きる状態）にしたままインポートして、 Bake Axis Conversion のチェックを付けてみます

![Blender 側での Export 設定を変えないままの場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/b694ff73-10b8-bfba-6b41-158dce426e03.png)

前が後ろになってしまいました。また、画像には写っていませんが子オブジェクトのスケールが100倍になったままです。

### Bake Axis Conversion を使う場合
どうやらこうするといいらしい、という情報[^4]に従い、

Apply Scaling: FBX All
Forward: -Y Forward
Up: Z Up
☑ Apply Unit
☐ Use Space Transform
☐ Apply Transform

![Bake Axis Conversion 前提の設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/ccfea16c-3426-55b2-7ab2-b5ede169665d.png)

と設定します。
-Y が前方、Z が上ということで、[#そもそも前ってどの方向？](#そもそも前ってどの方向？) で確認した通りの Blender の座標系そのまま出すという設定ですね。

![Bake Axis Conversion の結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208731/430af6a0-db90-4891-eff4-de873d3a9dbd.png)

やりました！　~~どうやらこうするといいらしい、に従っただけで煮えきらないですが~~ Front が Z 方向になり、Transform も正しくなりました。

# おわりに
何も分からず ACT を使っていたのが、何も分からず Blender と Unity の設定を触るのに変わっただけな気がしますが、ひとまず求める結果が出たので深追いしないことにします。

~~（ここから先は全部のチェックボックスを付けたり外したりして表を作ったり、仕様が非公開な FBX について、Blender の Export の実装詳細を調べたり、英語の情報をチェリーピックして翻訳する羽目になりそうな気がしているので……）~~

元記事と日本語で呟いてくださった @​namaeWatashino さん[^4] に感謝して結びの言葉とします。

### 余談:
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 パッケージ](https://docs.unity3d.com/ja/Packages/com.unity.formats.fbx@4.1/manual/index.html) で、Binary モードで出してください（Blender は ASCII 形式に対応していないので）

[^4]: https://twitter.com/namaeWatashino/status/1621502136340340737; 孫引きになるので原典も貼ると 
 https://polynook.com/learn/how-to-export-models-from-blender-to-unity

[^5]: （web屋、という曖昧な語感のほうが好き）

[^6]: 書こうとしていたテクニックを上手く適用できないパターンで傷を負ったり、背景を説明すると色々アレだったりしたため。言うほど黒魔術ではないので安心してください