
BlenderからのiPhone向けAR作り(USDZ)
2023年4月追記
これは古い記事です。2023年にリリースされたBlender3.5から直接USDZファイルに書き出す機能が追加されました。USD書き出しを選択し、拡張子を".usdz"にするだけ完結します。
この記事が書かれた背景にはBlenderのUSDファイルへの公式非対応と、その他の手段でUSDZに変換するにはApple PCのアカウント(事実上有料)が必要という事実がありました。それらの状況の抜け道として、Apple PCアカウントを持っていないWindowsユーザー向けに以下の記事を書きましたが、既に述べた通りBlender3.5を用いれば完全に不要な手順となります。
・はじめに
iPhoneやiPadのSafariで非常に容易にAR閲覧できる3Dモデル形式USDZの作り方の入り口を解説します.ウェブ上の既出情報を集めればわかる範囲の記事ですが,Unityを使った方法は日本語のテキストが僅少であったため執筆しました.
操作自体は小一時間もあれば習得できる内容かと思います.
次のような方向けの記事です
- Blender及びその他DCCツールの基本的な使い方を理解している
- Xcode 10コンソール以外の方法を探している(WindowsでUSDZファイルを作りたい方も)
- webサービスVIEWARやVectary以外の方法を探している
- Unityの経験不問
- iPhoneやiPadを所持している(AR動作確認用)
- ウェブページ作りの基本操作を理解している(公開用)
前半はUnityのインストールとUnity USDの設定、後半はUnity上での操作説明となっています. Unityを全く使った事が無い方向けの説明になります.経験者の方は末尾の「・慣れている方向けの説明」で十分かと思います.

・Unityをインストールする
以下ページからUnityHubSetup.exeをダウンロードし実行し、インストールします.
https://store.unity.com/ja#plans-individual
Unity Hubを起動します。Unityではなく,必ずUnity Hubから起動します.
左メニュー「インストール」からバージョン2019.2.11f1のUnityをインストールします.


後述のUSDアセットは動作バージョンが定められています.現状は2019.1.0b2以降対応とアナウンスされていますが,バージョンが離れると動作しない場合があります.
USDZエクスポートに限った用途ではBuild Supportは不要ですのでチェックを外しておきます(有効にしても問題はありません).

実行ボタンを押すとUnityのインストールが始まります(時間がかかります).
・Unityプロジェクトの作成
バージョン2019.2.11f1のインストールが終わったら再度Unity Hubを起動、プロジェクト画面右上「新規作成」ボタンを押します.

現れたウィンドウ名のバージョンが2019.2.11f1となっている事を確認します(異なるバージョンの場合には新規作成ボタンのプルダウンからバージョンを切り替えます).
右の新規作成から3D(デフォルト)を選択,任意のプロジェクト名を付けます(ここではUSDZ EXPORTERとします). そして作成をボタンを押すとUnityの立ち上げ処理が始まります.

しばらくするとUnityが立ち上がります.

・Unity USDの初期設定
上のWindow-PachageManagerをクリックします.
現れたPackagesビュー上部の検索窓にusdと入力,AdvancedプルダウンをクリックしShow preview packagesを選択します. するとUSD preview.1 – 1.0.1が現れるのでInstallボタンを押します. インストールが終わるとSpamplesをImport出来るようになりますが,ここでは使用しません.

次にUnity USDの公式サイトでガイドされている初期設定を行います.
https://github.com/Unity-Technologies/usd-unity-sdk
Edit-Project Settings-Player-Other Settings-Color Space*はデフォルトでGammaになっているのでLinearへ変更します. Configuration-Api Compatibility Level*の.NET Standard 2.0値を.NET 4.xへ変更します.
同Project Setting-Quality-Other-Skin Weithtsのデフォルト値4 BonesをUnlimitedへ変更します.
以上3つの操作が終わったらProject Settingウィンドウを閉じます.
・DCCツールで.fbxファイルを書き出す
AR表示したい3Dモデルを用意します.
ここでは下図のような2つのメッシュオブジェクトからなるモデルを作り,片方のマテリアルには1枚のテクスチャを割り当てました.

AR表示させたいメッシュオブジェクトを選択した状態でFile-Export-FBX(.fbx)を選びます.

エクスポートメニューはSelected Objectsにチェック,Meshのみを選択,ファイル名を指定してExportFBXボタンを押します.ここではusdz-cube.fbxとしました.

//
複数のマテリアルで構成する場合にはマテリアルごとにメッシュを分割のうえマージしておくとUnity上での作業がスムーズです.マテリアルの詳細設定はUnity側で行います.AR状態では環境によって色味が調整されてしまうので,ARで現物を見てから調整する順とした方が良いでしょう.
//
・Unityへモデルデータとテクスチャを取り込む
Unityへ戻り,中央上のSceneビューをクリックします.
3Fモデルの.fbxファイルとマテリアルで使用するテクスチャを、Unity下部のProjectビュー内AssetsへDnDします。

//
プロジェクト管理的にはお行儀のよいやり方ではありませが,ファイル形式をコンバートするだけのプロジェクトですので問題は起きにくいでしょう.
//
取り込んだファイルは読み書きできない属性になっており,そのままではUnity USDが処理してくれません. 画面右Inspectorビュー-Meshes-Read/Write Enabledにチェックを入れ,右下Applyを押します.

エクスポートモデルの原点を作ります.上部メニューGameObject-Create Emptyをクリックします.すると左HierarchyビューにGameObjectというオブジェクトが追加されます.分かりやすいようUSDZzeroへ名前を変えておきます.

下ProjectビューAssetsからusdz-cubeをUSDZzeroへDnDします.するとScneneビューにモデルが表示されます.

usdz-cubeの左の矢印をクリックして下層を表示し,画面下Assetsからテクスチャを片方のメッシュオブジェクトへDnDします.すると自動的にAssets内にMaterialsフォルダが生成されます.

テクスチャを貼り付けないメッシュオブジェクト用のマテリアルも作成します.Assets-Materialsフォルダへ移動,右クリック-Create-Materialをクリック.名前はBlueMatへ変更しておきます.
BlueMatを選択した状態で画面右Inspectorビュー内でシェーダーの選択,設定変更が出来ます.Main Maps-Albedoのカラーピッカーで青色へ変更します.
(ついでに別のテクスチャをAssetsへインポートし,Normal MapへDnDしました.)

このままでも良いのですが,特に設定を行わないとオブジェクトが大き過ぎて閲覧し難いのでリサイズを行います.Hierarchyのusdz-cubeを選択した状態でInspectorのScale値を3軸とも0.05とします.

・.usdzファイルのエクスポート
以上で簡易ながらシェーダーとマテリアルの設定が終わったのでエクスポートを行います.
HierarchyのUSDZzeroを選択した状態で上メニューUSD-Export Selected as USDZを選択します.通常の保存ウィンドウが出ますので任意のフォルダへ出力したら完了です.

このファイルをウェブサーバーへアップロードし,iPhoneやiPadのSafariで参照すると専用ビュワーが立ち上がり,ARまたはモデルビューで閲覧できます.サムネイルを設定する方法は別途検索してください.
macOS Mojave以降であれば.usdzファイルを直接閲覧することもできます.
・トラブルシューティング
モデルが表示されない場合は以下を再確認してください.
・Unity本体のバージョンは適切か.
・fbxファイルのInspectorでRead/Write Enabledにチェックが入っているか.
・Unity USDがサポートしていないシェーダー設定になっていないか(まずは最小限の設定で行いましょう).
//
簡易的な確認方法を紹介します.エクスポートしたいオブジェクトをメニューUSD-Export Selected with Childrenでusd出力し,そのusdファイルをUSD-Import as GameObjectsで読み込んだ際にメッシュオブジェクトが表示されない場合,設定上何らかの問題があると考えられます.
//
・慣れている方向けの説明
・Unity USDとUnityのバージョンに注意.
・Unity USDはfbxでもobjでもusdz変換してくれるが,メッシュオブジェクトをRead/Write Enabledにしないと正常に処理してくれない.
・ShaderはUSD/StandardVertexColorだけでなくStandardでもよい.寧ろStandardの方が高機能.だが一部の機能のみ有効. AlbedoやNormal Mapは機能するがTillingは機能しないなど.
・さいごに
以上Windows PCからUSDZファイルを出力する事を念頭にUnity USDのファーストステップを解説しました.とりあえず3DモデルをiPhoneでAR表示したいというニーズであればこれで十分かと思います.
MacOS環境でもUnity経由であればシーンの編集もグラフィカルで容易ですのでDCC-Xcode 10で作業するよりも手軽と言えるでしょう. ただし細かい設定を行いたい場合は最終的にXcode 10に頼った方が良いかもしれません.
Viva Blender! Viva Unity! そしてARの未来に幸あれ.
・参照ページ
https://unity.com/
https://github.com/Unity-Technologies/usd-unity-sdk
https://alaki.co.jp/blog/?p=2967