RoomPlanの出力ファイルをUnityで使う | DAFTCRAFT ENGINEER BLOG
iOS/iPadOS 16の新機能としてRoomPlanが登場しました。RoomPlanを使うと部屋の3Dモデルを簡単に作る事ができます。RoomPlanはあくまでiOS/iPadOSの機能なので、そのままUnityで使う事はできません。しかしRoomPlanで認識した部屋を出力してUnityで使う事はできます。今回はRoomPlanのサンプルで部屋を認識して、その認識した部屋のモデルをUnityでどう使うか試しました。
目次
必要な環境
- XCode 14
- iOS / iPadOS 16
RoomPlan発表時はXCodeもiOS/iPadOSもベータを使う必要がありましたが、現在は正式リリースされているので、最新環境に更新すればビルドと実行ができます。
RoomPlanサンプル実行の様子
認識した部屋をエクスポート
RoomPlanサンプルで認識した部屋はファイルにエクスポートできます。エクスポートされるファイルはUSDZで、これはUSDフォーマットの一種です。まずusdとusdzの特徴について簡単にまとめます。
USD(Universal Scene Description)の特徴
- DCCツール間で3Dシーンをやりとりするための汎用的なフォーマット
- Pixar社が開発、提唱し、オープンソースで公開している
- 3Dシーンを定義、パッケージ化
- 3Dシーン: モデリング、シェーディング、アニメーションなど
- 3Dシーンがアプリケーション特有のデータだと他アプリケーションとの連携が取れない
- 3Dシーンを汎用的に扱えるように定義、パッケージ化したものがUSD
- リグは付けられない
- ファイルは1つではなく複数に分割でき、参照することでデータとしてまとめられる
- e.g.
部屋.usda
が机.usda
と椅子.usda
を参照することで、机と椅子の置かれている部屋を表現
- e.g.
- USDフォーマットのバリエーション
- usda: テキストフォーマット
- usdc: バイナリフォーマット
- usdz: アーカイブフォーマット(後述)
usdzの特徴
- USDの複数ファイルを非圧縮zipとしてまとめたもの(アーカイブ)
- USD形式のシーンデータ(usda,usdc)と画像データなどのアセットがまとめられている
- ARアプリケーション向けにAppleが採用している
よく使う3DモデルのファイルとしてFBXがあります。FBXは全てのデータを1つのファイルにまとめますが、USDはファイルが複数にわかれ参照することでシーンとしてまとめているところが大きな違いです。USDが3Dモデルではなく3Dシーンの表現を目的としていることがわかります。
Unityで認識した部屋を表示
UntiyはそのままだとUSDに対応していないのでパッケージのインストールが必要です。
インストールはPackageManagerから行います。
- ウィンドウの左上の+を押す
Add Package from git URL
を押す- URLに
com.unity.formats.usd
と入力してAdd
を押す
以上でUSDパッケージをインストールできました。
インストール後はUntiyのメニューバーにUSDが追加されます。USDファイルのインポートはここから行います。
USDパッケージはusdaとusdcは対応していますが、usdzには対応していません。そのため今回はusdzの中のusdaを使って認識した部屋を表示します。usdaはusdzをzip展開すると取得できます。
Room.usdz
をzip展開した結果が以下のファイルツリーです。
$ tree
.
├── Room.usda
└── assets
└── Parametric
├── Chair
│ ├── Chair0.usda
│ └── Chair1.usda
├── Sofa
│ ├── Sofa0.usda
│ └── Sofa1.usda
├── Storage
│ ├── Storage0.usda
│ ├── Storage1.usda
│ ├── Storage2.usda
│ └── Storage3.usda
├── Table
│ ├── Table0.usda
│ └── Table1.usda
├── Television
│ └── Television0.usda
└── Walls
├── Wall0
│ ├── Door0.usda
│ ├── Door1.usda
│ └── Wall0.usda
├── Wall1
│ ├── Wall1.usda
│ └── Window0.usda
├── Wall2
│ └── Wall2.usda
├── Wall3
│ └── Wall3.usda
├── Wall4
│ └── Wall4.usda
├── Wall5
│ └── Wall5.usda
├── Wall6
│ └── Wall6.usda
├── Wall7
│ ├── Wall7.usda
│ └── Window0.usda
└── Wall8
├── Door0.usda
└── Wall8.usda
ルートにある Room.usda
が部屋全体を表すusdファイルです。このRoom.usda
がUSDパッケージでインポートするファイルです。 assetsディレクトリ以下には、室内のオブジェクトのusdaファイルがディレクトリ分けされています。Room.usdaはこれらassets以下のusdaを参照して、部屋のどこになにがあるか表現しています。
実際にusdaをインポートしてUnityのシーンに配置すると以下のようになります。RoomPlanからエクスポートしたusdzはUnityと座標系が違うため、x軸反転すると実際の部屋に合った見た目になります。
床と天井がないところは注意が必要です。単純な対応としては、オブジェクト全体のy座標を壁の高さの半分上げるとy=0
が床になります。この場合y=壁の高さ
が天井です。これは部屋の高さ=壁の高さという前提です。
Hierarchyを見るとおおよそファイルツリーと同じような構造になっていることがわかります。異なる点は、壁や窓などの構造物が Arch_grp
、棚やTVなど室内のオブジェクトが Object_grp
とまとめられているところです。
そして、オブジェクトにWallやStorage,Chairなどわかりやすい名前が付いていることもわかります。確認できたオブジェクト名は以下の通りです。
- Wall
- Window
- Door
- Table
- Storage
- Sofa
- Bed
- Chair
- Television
Wall_1_grp
ではWall1オブジェクトとWindow0オブジェクトをグループ化して壁の1面を表現していることが分かります。
Television0
オブジェクトは単純な立方体ですが、情報として位置、向き、大きさを持っています。ですので、必要に応じて任意の3Dモデルに置き換えるといった使い方も考えられます。
しかし、3Dモデルに置き換えるにはそのオブジェクトの情報(名前、位置、大きさ、向き)だけでなく、他のオブジェクトとの関係も考慮しないと違和感が生じるものもあります。例えば、本棚も食器棚もTV棚もオブジェクト名はStorageなので、オブジェクト名を見るだけでは区別がつきません。
オブジェクトの名前ごとに決まった色を適用するだけであれば、3Dモデルに変更より簡単にできます。この例では、TVを水色、棚を茶色、ソファーを赤、窓を青にしています。これだけでもソファーに座ってTVを見るというイメージが思い浮かべられると思います。
まとめ
今回はRoomPlan自体の扱いはサンプルにまかせ、認識した部屋がどう扱えるかを試しました。
RoomPlanは壁や机、ソファーなど何がどこに置かれているかも含めて部屋を認識して、出力されるファイルにもその情報が入っています。つまり家具の配置された部屋のデータとして活用ができます。
UnityでUSDファイルを使うには一手間必要なため、現状はUSDはUnityで扱いやすいとは言えません。しかし、今回のRoomPlanのようにAppleもUSDを使っていますし、3DスキャンアプリのScaniverseもUSD出力に対応しています。このようなxR領域での活用が増えていますし、USDフォーマットには色々な利点があります。UnityのUSD対応はまだプレビューなので、これから扱いやすくなるのではないかと思います。
Untiyでインポートした後は、他のモデルデータと同じように扱えました。オブジェクト名が家具の種類となっているため、家具の種類に応じた色や大きさの変更といった操作が簡単に行えます。
USD対応のモデリングツールで調整してからUntiyで使うという事も考えられます。現状だとUnityでUSDを直接使うよりは、モデリングツールで調整してfbxエクスポートした方が簡単かもしれません。
岩城 謙太
Unity エンジニア | サーバーサイドや機械学習エンジニアリングを含め10年以上の開発経験を持つ