Help us understand the problem. What is going on with this article?

[Unity,AR]Unityを使って超簡単にiOS向けARファイルを作成する

More than 1 year has passed since last update.

はじめに

皆さんはUSDZファイルをご存じでしょうか?
簡単にいってしまうと3Dシーン(モデル等)を保存したファイルです。
このファイルの特徴の一つにiOS12以上のiPhoneであれば追加でアプリをインストールすることなくARプレビュー可能というものがあります。1
追加でアプリをインストールする必要がなく、ブラウザさえあればプレビュー可能なのでお手軽にAR体験が可能です。

参考:Quick Lookギャラリー - 拡張現実 - Apple Developer

昨年USDZファイルを作成する記事を書いたのですが、このときはまだ情報やツールが出そろっておらず大変面倒でした。
今年になってUnityを使用すれば超簡単にUSDZファイルを作成することができるということが分かったのでその方法をご紹介します。

この記事を読めば以下のようなものを作成することができます。

注:以下の内容はWindowsでのみ動作確認を行っております。

モデルの準備(Unityインポートまで)

AR化するためのモデルを用意します。
今回は『禍つヴァールハイト』バージョンのシロちゃんを使用させていただきました。

siro.jpg

https://www.magatsu-wahrheit.com/news/387/ より引用

©App Land ©KLabGames

!!必ず使用するモデルの利用規約に目を通してください。また、詳細なインポート方法については解説しません。!!

FBXをエクスポートする際には以下の点に気を付けてください。
(基本的にBlenderベースの解説です。)

  1. Unityにインポートしたときにスケルトンの回転が0になるようにする
  2. 1メッシュ1マテリアルになるようにする
  3. 頂点数を抑える
  4. ブレンドシェイプを焼き付ける
  5. テクスチャを同梱する

1. Unityにインポートしたときにスケルトンの回転が0になるようにする

これをしておかないとアニメーションをつける際に面倒なことになります。2
アニメーションをつけない場合は特に問題はありません。

Blenderの場合は以下の操作で実行できます。

1.ArmatureをObjectModeでX-90度に回転する

image.png

2.Ctrl-Aで出てくるメニューからApply Rotationを実行する

image.png

実行後にArmatureのRotationが0,0,0になっていることを確認してください。

3.ArmatureをObjectModeでX90度に回転する

前回の操作でRotationが0,0,0になっているはずなので90,0,0になるように回転します。
このときにApply Rotationを実行してはいけません。

image.png

4.キャラクタのすべてのメッシュを選択しApply Rotationを実行する

image.png

この状態でFBXエクスポートを行うとArmatureの回転が0になっています。
参考:Blender to Unity with Correct Scale and Rotation

2. 1メッシュ1マテリアルになるようにする

これについてはよくわかりませんが1メッシュに複数のマテリアルが付いていると表示されません。
1メッシュ1マテリアルになるように分割しましょう。

3. 頂点数を抑える

特に説明することはありませんが、あまりにも頂点数が多いと古い端末ではモデルが表示されないことがあります。

4.ブレンドシェイプを焼き付ける

iOSのAR表示ではブレンドシェイプが適用されません。3
表情をつけたい場合はエクスポートする段階でブレンドシェイプの情報をモデルに焼き付けておく必要があります。

Blenderの場合は以下の操作で実行できます。

この操作はモデルを直接編集するので実行する前にバックアップを取っておいてください

1.オブジェクトモードでシェイプキーの値を変更する。

image.png

2.Mixキーを作る

複数のシェイプキーを使用する場合はMixキーを作成する必要があります。
複数のシェイプキーの値を設定した後、右側のボタンからNew Shape From Mixを実行してください。

image.png

その後、最初に設定したシェイプキーの値を0に戻しMixキーの値を1にします。
そうすると最初に設定した状態の頂点になります。

image.png

3.Mixキー以外のキーを削除する

この状態でMixキー以外のすべてのキーを削除します。
するとFBX書き出しの際にデフォルトの頂点情報がMixキーで設定した状態になります。

image.png

image.png

5.テクスチャを同梱する

これは必須ではありませんがやっておくとテクスチャの設定が楽になります。

Blenderの場合は以下の操作で実行できます。
  • FBXをエクスポートする際のオプションでPathModeをCopyにして右のアイコンが以下の画像の状態になるようにする。

モデルの準備(Unity上での操作)

Unity上では以下の操作を行います。

  1. テクスチャの設定
  2. マテリアルの設定
  3. メッシュの設定
  4. スケルトンの確認
  5. Transformの確認
  6. (必要に応じて)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は以下のページから購入できます。

Dynamic Bone - Asset Store

どうしても無料がいい場合はSpringBoneを使用するという選択肢もあります。
DynamicBone/SpringBoneの設定についてはWebに素晴らしい記事がありますので検索してみてください。

スカートをいい感じに見せるためには以下の記事が参考になります。

[VRChat]ふわっとしたスカートで座っても安心のDynamicBone吊りスカート

アニメーションしないUSDZファイル出力

まずはアニメーションしないバージョンのUSDZファイルを作成します。
UnityのパッケージマネージャーからUSDをインストールしてください。
(2019/12/1時点では)USDはプレビューパッケージなのでShow preview packagesにチェックを入れていないと出てこないので注意してください。

image.png

インストールが完了するとUnityのメニューにUSDが追加されます。
ヒエラルキー上に配置したモデルを選択した状態でUSD > Export Selected as USDZを実行します。

するとファイルの保存先が聞かれるので適当な場所に保存します。
これで完了です:rocket:
すごく簡単ですね:relaxed:

保存したファイルをiPhoneでダウンロードすればプレビューすることができます。

サムネイルの状態で前後が逆になっている場合、
以下のようなヒエラルキーにした状態でRootを選択してエクスポートを実行します。


もしテクスチャが貼られていない場合や一部のメッシュが表示されていない場合はテクスチャ名、Transform名に日本語が使用されていないかどうかチェックしてください。

PCにpythonがインストールされている場合は以下のコマンドで簡単にHTTPサーバーを立てることができます。

cd path/to/usdz/directory
# python2系
python -m SimpleHTTPServer
# python3系
python -m http.server

アニメーションするUSDZファイル出力

アニメーションするUSDZファイルを出力するのはしないものに比べて多少面倒になります。
また、USDパッケージだけでもやろうと思えばできますが簡単にするためのユーティリティを作成したのでそちらを使用します。

yaegaki/UnityUsdzUtil

リリースのページからUnityUsdzUtil.unitypackageをダウンロードしてください。

UnityUsdzUtil.unitypackageには以下のファイルが入っています。

image.png

パッケージをインポートしたらUsdzRecordStand.prefabをシーンに配置してください。
そしてエクスポートしたい対象をUsdzRecordStand > Rootの子オブジェクトとしに設定してください。
以下の画像のような状態になれば大丈夫です。

image.png

その後、Unityを実行状態にしてモデルにアニメーションを適用します。
エクスポートしたい場所でUsdzRecordStandRecordボタンをクリックします。

image.png

するとRecordボタンを押してから既定では約5秒後にusdzファイルの出力が完了します。
このファイルをiPhoneでダウンロードすれば作業は完了です:point_up:

おまけ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フレームにかかる現実の時間は長くなりますが、いい感じに出力できる可能性があります。

image.png

UsdzHttpServerにアクセスできない

一度Stopしてからもう一度Startしてみてください。
それでもアクセスできない場合はPCのファイアーウォールの設定を確認してください。

出力時にエラーが出て失敗する

エラーメッセージを見て対処してください。
エラーメッセージが解決の参考にならない、どうしても解決できない場合はPCを再起動してみてください。
解決する可能性があります。

おわりに

モデルやアニメーションの設定が少し手間ですが、設定してしまえばすごく手軽にAR表示までもっていくことができます。
アニメーション付きのモデルをAR表示させると思っていた以上に良いので皆さんもぜひ試してみてください。


  1. iPhone6sより前の端末では使用できません。またiPhoneX系の端末とそれ以前の端末で多少機能に違いがあります。 

  2. iOSで表示する際にスケルトンの回転情報が無視されます。usdviewで見ると正常なのでおそらくバグです。iOSのバージョンが上がることで問題なくなるかもしれません。 

  3. usdの仕様上は存在していますがunity-usdが対応しておらず、iOS側も対応していません。将来的には対応されるかもしれません。 

  4. Windowsで作業している場合は反映されません。Macで作業した場合は反映されるかもしれませんが未確認です。 

yaegaki
アセンブリからWebまで広くやっています。
https://yaegaki.dev/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away