はじめに
皆さんはUSDZファイルをご存じでしょうか?
簡単にいってしまうと3Dシーン(モデル等)を保存したファイルです。
このファイルの特徴の一つにiOS12以上のiPhoneであれば追加でアプリをインストールすることなくARプレビュー可能というものがあります。1
追加でアプリをインストールする必要がなく、ブラウザさえあればプレビュー可能なのでお手軽にAR体験が可能です。
参考:Quick Lookギャラリー - 拡張現実 - Apple Developer
昨年USDZファイルを作成する記事を書いたのですが、このときはまだ情報やツールが出そろっておらず大変面倒でした。
今年になってUnityを使用すれば超簡単にUSDZファイルを作成することができるということが分かったのでその方法をご紹介します。
この記事を読めば以下のようなものを作成することができます。
家に帰ってきたらシロちゃんが椅子に座ってた
— fino (@fi_n_o) December 2, 2019
©App Land ©KLabGames#SiroTalk pic.twitter.com/tQQ7mTOHtW
注:以下の内容はWindowsでのみ動作確認を行っております。
モデルの準備(Unityインポートまで)
AR化するためのモデルを用意します。
今回は『禍つヴァールハイト』バージョンのシロちゃんを使用させていただきました。
©App Land ©KLabGames
!!必ず使用するモデルの利用規約に目を通してください。また、詳細なインポート方法については解説しません。!!
FBXをエクスポートする際には以下の点に気を付けてください。
(基本的にBlenderベースの解説です。)
- Unityにインポートしたときにスケルトンの回転が0になるようにする
- 1メッシュ1マテリアルになるようにする
- 頂点数を抑える
- ブレンドシェイプを焼き付ける
- テクスチャを同梱する
1. Unityにインポートしたときにスケルトンの回転が0になるようにする
これをしておかないとアニメーションをつける際に面倒なことになります。2
アニメーションをつけない場合は特に問題はありません。
Blenderの場合は以下の操作で実行できます。
1.ArmatureをObjectModeでX-90度に回転する
2.Ctrl-Aで出てくるメニューからApply Rotationを実行する
実行後にArmatureのRotationが0,0,0になっていることを確認してください。
3.ArmatureをObjectModeでX90度に回転する
前回の操作でRotationが0,0,0になっているはずなので90,0,0になるように回転します。
このときにApply Rotationを実行してはいけません。
4.キャラクタのすべてのメッシュを選択しApply Rotationを実行する
この状態でFBXエクスポートを行うとArmatureの回転が0になっています。
参考:Blender to Unity with Correct Scale and Rotation
2. 1メッシュ1マテリアルになるようにする
これについてはよくわかりませんが1メッシュに複数のマテリアルが付いていると表示されません。
1メッシュ1マテリアルになるように分割しましょう。
3. 頂点数を抑える
特に説明することはありませんが、あまりにも頂点数が多いと古い端末ではモデルが表示されないことがあります。
4.ブレンドシェイプを焼き付ける
iOSのAR表示ではブレンドシェイプが適用されません。3
表情をつけたい場合はエクスポートする段階でブレンドシェイプの情報をモデルに焼き付けておく必要があります。
Blenderの場合は以下の操作で実行できます。
この操作はモデルを直接編集するので実行する前にバックアップを取っておいてください
1.オブジェクトモードでシェイプキーの値を変更する。
2.Mixキーを作る
複数のシェイプキーを使用する場合はMixキーを作成する必要があります。
複数のシェイプキーの値を設定した後、右側のボタンからNew Shape From Mix
を実行してください。
その後、最初に設定したシェイプキーの値を0に戻しMixキーの値を1にします。
そうすると最初に設定した状態の頂点になります。
3.Mixキー以外のキーを削除する
この状態でMixキー以外のすべてのキーを削除します。
するとFBX書き出しの際にデフォルトの頂点情報がMixキーで設定した状態になります。
5.テクスチャを同梱する
これは必須ではありませんがやっておくとテクスチャの設定が楽になります。
モデルの準備(Unity上での操作)
Unity上では以下の操作を行います。
- テクスチャの設定
- マテリアルの設定
- メッシュの設定
- スケルトンの確認
- Transformの確認
- (必要に応じて)DynamicBoneの設定
1. テクスチャの設定
FBXにテクスチャを同梱している場合、以下のボタンからテクスチャをアセットとしてUnityに取り込むことができます。
取り込んだテクスチャの名前は必ずアルファベットのみで構成されるようにしてください。
日本語が使用されているとうまく表示されない可能性があります。4
2. マテリアルの設定
今回紹介する方法では基本的にはStandardシェーダーを使う必要があります。
それ以外のシェーダを使用している場合はStandardシェーダーでうまく見えるように調整してください。
3. メッシュの設定
モデルのメッシュは必ずRead/Write Enabledにしておく必要があります。
4. スケルトンの確認
ヒエラルキー上にモデルを配置し、スケルトンのRotationが0,0,0
になっていることを確認してください。
必ずUnityにインポートした時点で既にRotationが0,0,0
になるようにしてください。
ヒエラルキーやプレハブのRotationをあとから編集した場合はアニメーションを行った際に正しく表示されない可能性があります。
0,0,0
になっていない場合はUnityにインポートしたときにスケルトンの回転が0になるようにするを参考に設定してください。
5. Transformの確認
Transformの名前がすべてアルファベットのみで構成されるようにしてください。
日本語が使用されている場合うまく表示されない可能性があります。
6. (必要に応じて)DynamicBoneの設定
アニメーションをつける場合はDynamicBoneがあるかないかで見栄えの差が大きくなります。
DynamicBoneは以下のページから購入できます。
どうしても無料がいい場合はSpringBoneを使用するという選択肢もあります。
DynamicBone/SpringBoneの設定についてはWebに素晴らしい記事がありますので検索してみてください。
スカートをいい感じに見せるためには以下の記事が参考になります。
[VRChat]ふわっとしたスカートで座っても安心のDynamicBone吊りスカート
アニメーションしないUSDZファイル出力
まずはアニメーションしないバージョンのUSDZファイルを作成します。
UnityのパッケージマネージャーからUSDをインストールしてください。
(2019/12/1時点では)USDはプレビューパッケージなのでShow preview packagesにチェックを入れていないと出てこないので注意してください。
インストールが完了するとUnityのメニューにUSDが追加されます。
ヒエラルキー上に配置したモデルを選択した状態でUSD > Export Selected as USDZ
を実行します。
するとファイルの保存先が聞かれるので適当な場所に保存します。
これで完了です
すごく簡単ですね
保存したファイルをiPhoneでダウンロードすればプレビューすることができます。
サムネイルの状態で前後が逆になっている場合、
以下のようなヒエラルキーにした状態でRootを選択してエクスポートを実行します。
もしテクスチャが貼られていない場合や一部のメッシュが表示されていない場合はテクスチャ名、Transform名に日本語が使用されていないかどうかチェックしてください。
PCにpythonがインストールされている場合は以下のコマンドで簡単にHTTPサーバーを立てることができます。
cd path/to/usdz/directory
# python2系
python -m SimpleHTTPServer
# python3系
python -m http.server
アニメーションするUSDZファイル出力
アニメーションするUSDZファイルを出力するのはしないものに比べて多少面倒になります。
また、USDパッケージだけでもやろうと思えばできますが簡単にするためのユーティリティを作成したのでそちらを使用します。
リリースのページからUnityUsdzUtil.unitypackageをダウンロードしてください。
UnityUsdzUtil.unitypackageには以下のファイルが入っています。
パッケージをインポートしたらUsdzRecordStand.prefabをシーンに配置してください。
そしてエクスポートしたい対象をUsdzRecordStand > Root
の子オブジェクトとしに設定してください。
以下の画像のような状態になれば大丈夫です。
その後、Unityを実行状態にしてモデルにアニメーションを適用します。
エクスポートしたい場所でUsdzRecordStandのRecordボタンをクリックします。
するとRecordボタンを押してから既定では約5秒後にusdzファイルの出力が完了します。
このファイルをiPhoneでダウンロードすれば作業は完了です
おまけ1 - UsdzRecordStandのインスペクタ項目について
項目 | 説明 |
---|---|
ExportDirectory | usdzファイルを作成するディレクトリ |
ExportFileName | usdzファイルの名前。空白の場合Rootの最初の子の名前になる。 |
CreateUsdaFile | 中間ファイルとしてusdaを作成する。主にデバッグ用。 |
ThumbnailCamera | サムネイルを撮影するカメラ |
ExportRoot | エクスポートするルート |
FrameRate | 出力するアニメーションのフレームレート |
RecordSec | 出力するアニメーションの時間 |
FlipZ | 出力時にY+180度回転する。 |
PauseWhenFinished | Recordが終わった時にエディタを一時停止する。 |
CurrentFrame | 現在記録中のフレーム |
Snapshot/Record | 出力ボタン。プレイ中かそうでないかでSnapshotかRecordが変わる。 |
ExportFromFile | CreateUsdaFileで作成したファイルを使ってusdzファイルを作成する。主にデバッグ用。 |
おまけ2 - UsdzHttpServer
UsdzRecordStand.prefabにはもう一つUsdzHttpServerというスクリプトが付いています。
これはその名の通りHttpサーバースクリプトです。
StartボタンをクリックするとUsdzファイルの配信サーバーが立ち上がります。
http://Unityを起動しているマシンのIP:19900
にiPhoneでアクセスすると以下のようにサムネイル付きでUsdzファイルを確認することができます。
トラブルシューティング
USDZファイルの中身がおかしい
USDZファイルの中にモデルが出力されない場合以下の原因が考えられます。
- テクスチャ名に日本語を使用している
- Transform名に日本語を使用している
- モデルのRead/Write Enabledがオンになっていない
- 1メッシュに複数のマテリアルが使用されている
これらの設定を確認してみてください。
アニメーションを適用したモデルが90度倒れて表示される場合はスケルトンに回転が掛かっている可能性があります。
スケルトン(Armature)の回転が0,0,0
になっていることを確認してください。
iPhoneで表示する際にエラーが発生する場合はモデルの頂点数が多すぎる、長すぎるアニメーション時間などが考えられます。
頂点数の削減や記録時間を短くするなどの対策をしてください。
どうしても原因が分からない場合はUSD Toolsetを使って原因を調査します。
ただし、USD Toolsetはソースでしか配布されていないのでビルドする必要があるので少し手間です。
USDZのファイルサイズが大きすぎる
usdzファイルのファイルサイズが大きすぎる場合、テクスチャの設定を見直すことで改善される可能性があります。
テクスチャのサイズやフォーマットを変更してみてください。
少しでもファイルサイズを小さくしたい場合はモデルの頂点数を削減する、アニメーションの時間を短くするなどを行ってください。
DynamicBoneが暴れる
Unityを普通に実行したときとアニメーション付きUSDZを出力しながら再生したときでDynamicBoneの挙動に差がある場合があります。
アニメーション付きUSDZファイルの出力にはそこそこマシンパワーが必要なため、
1フレームの時間が長くなることによってDynamicBoneが暴れます。
その場合はDynamicBoneのUpdateRateを調節してみてください。
それでもうまくいかない場合はUnityのTimestepを変更するという最終手段があります。
Timestepを以下のように設定すると1フレームにかかる現実の時間は長くなりますが、いい感じに出力できる可能性があります。
UsdzHttpServerにアクセスできない
一度Stopしてからもう一度Startしてみてください。
それでもアクセスできない場合はPCのファイアーウォールの設定を確認してください。
出力時にエラーが出て失敗する
エラーメッセージを見て対処してください。
エラーメッセージが解決の参考にならない、どうしても解決できない場合はPCを再起動してみてください。
解決する可能性があります。
おわりに
モデルやアニメーションの設定が少し手間ですが、設定してしまえばすごく手軽にAR表示までもっていくことができます。
アニメーション付きのモデルをAR表示させると思っていた以上に良いので皆さんもぜひ試してみてください。