空間を3Dキャプチャし、ARアプリ開発に利用する
前回の記事では、ARクラウドと組み合わせ、リプレイデータを使ってローカライズを行う手法を紹介しました。
今回はより現実空間に紐付いた環境でAR開発を行うために、空間をスマホでスキャンし、キャプチャできた3Dデータを使ってUnity MARS上でSimulation Environmentを構築し、ARの開発やデバッグに活用できないか検討しました。
Unity MARSとは?
Unity MARS(Mixed and Augmented Reality Studio)はUnity Technologies社によって開発されているARアプリケーションのオーサリングのためのUnityプラグインです。開発者が現実世界とアプリケーションの座標フレームをあわせることは容易ではないため、ファジーな配置ルールで小規模な座標系に分割してコンテンツの挙動を定義できる仕組みにより、現実世界を柔軟に抽象化することができるようになっているそうです。Unity MARSの設計思想についてはこちらのブログで詳しく解説されています。
1. 3Dキャプチャ
現実空間をキャプチャし3Dモデル化する方法はいくつかあります。画像データから特徴点マッチングにより3Dモデルを生成するフォトグラメトリといった手法や画像やセンサから点群データを取得しメッシュ化により3Dモデルを生成する手法などがあります。
また、3Dスキャニングをする機器もLiDARを搭載したスマートフォンからLeica BLK360やNavVis M6のような専用のLiDARスキャナまで様々な機器も出てきています。
フォトグラメトリや LiDAR 搭載のデバイス/アプリケーションの普及やメタバースが話題となり、最近では、空間をキャプチャして共有するコミュニティも盛り上がりつつあります。
キャプチャアプリについては以下のブログ等でも紹介されています。ツールによって広い空間のキャプチャを得意とするもの、小さめのオブジェクトを得意とするものなど多数出てきているようですので色々試してみると良いでしょう。
今回は、LIDAR搭載のiPhoneやiPadで利用可能な、3D Scanner Appを利用して、450㎡ほどの屋内をスキャンしてみました。
スキャン後、Unityにインポートできるように、Mesh化しテクスチャリングを行い、obj形式でエクスポートします。
2. Simulated Environment作成
Unity MARSには実世界のスナップショットに相当するSimulation Environmentによりコンテンツをプレビューすることができるシミュレーション機能があります。シミュレーション環境には屋内外を模した3Dモデルが数十種類用意されている(Fig.1)ほか、自身で3Dモデルを作成することもできます。
Projectウィンドウ上で、Create > MARS > Simulated Environment Prefab を選択します。このPrefabには、シミュレーションのカメラビューや開始位置などの設定(MARSEnvironmentSettings)や、環境から平面を生成するコンポーネント(PlaneExtractionSettings)がアタッチされています。
ここに、1.で作成した空間キャプチャした3Dモデルをヒエラルキーに追加します。シミュレーション環境に合うようにサイズやライティングなどを調整します。
次にMARSのProxy Ruleが利用できるように、床やテーブル、ソファーなどの平面を環境を構成する要素として抽出して保存します。
平面を検出する方法は2つあります。
i) 自動生成
Simulation EnvironmentにアタッチされたPlaneExtractionSettingsコンポーネントを使用すると、メッシュレンダラーから自動的に平面を抽出することができます。PlaneExtractionSettingsにあるExtract Planes ボタンをクリックすると、シーン内のランダムな位置からのレイキャストにより、3Dオブジェクトのメッシュから点群を生成し点群からグリッド平面が検出されます。
ii) シミュレーションから生成
MARS Simulationのデバイスビューを利用し、シーン内を探索し、平面を検出することができます。平面ビジュアライザーにより、検出された平面のジオメトリが表示されます。検出された平面は GeneratedPlanes配下にSynthesizedObjectsとして保存できます。
今回はPlane Extraction Settingsコンポーネント(Fig.2)を使って自動で平面を検出してみたいと思います。 Voxel Generation ParamsやPlane Finding Paramsを環境の広さやメッシュの精密さなどに合わせて調整し、Extract Planes をクリックします。
平面が検出できると、ヒエラルキーのGenerated Planes要素にGeneratedSimulatedPlaneが自動生成されます。(Fig.3, Fig.4)
壁やテーブルの平面が検出できていることが確認できます。各PlaneにはMARS Database上でセマンティクスを管理するためのスクリプト(Fig.6)がアタッチされています。例えば、Synthesized Semantic Tagにtableなどのタグを設定しておくと、各tableにオブジェクトを出すといったルールベースのコンテンツの配置が可能になります。またPlaneに限らず、MARSではTraitsという様々なエンティティに意味を持たせProxyで扱うことができる機能が提供されています。このTraitsはReasoning APIを利用することで動的に生成することができるため、将来的にサードパーティーのデータプロバイダなどが様々な現実空間のセマンティクスを提供することが期待できます。
3. 確認
シミュレーション結果を確認するため、MARS Proxyオブジェクトを作成します。 MARSでは、現実の世界とアプリのデジタルコンテンツをつなぐプレースホルダーの役割をするProxyという概念があります。Proxyを使って現実世界のオブジェクトや場所に関連付けていきます。Proxyの作り方はいくつかの方法があります。
i) Create toolを使ってSimulation dataから自動で生成する方法
Option1. 配置したいオブジェクトのPrefabを直接シミュレーションビューにDrag&Dropする
Option2. Create toolでPlaneを選択する
ToolsメニューからMARS Create Toolを選択し、シミュレーションビューの中のPlaneを選択し、Create Proxyをクリックすると、このPlaneに該当する条件でProxyが作成されます。
ii) スクラッチから作る方法
ヒエラルキー上でMARS > Proxy Object を選択し、Proxy Objectを追加します。
次に、追加したProxy Objectを選択し、Add Condition… をクリックし、Trait > Plane や Height Above Floor, Plane Sizeなど、ARが発生する条件を追加していきます。
Compare Toolの Compare in Simulation Viewをクリックすると、シミュレーションビュー上のPlaneが条件にマッチするかどうかのテストや条件パラメータの最適化が行えます。
今回はテーブル上にオブジェクトを出現させたいためテーブルのPlaneをクリックし、OptimizeをクリックしProxyObjectの条件を最適化させていきます。(Fig.7)
Proxy Objectを作成したら、ObjectをProjectウィンドウにDrag&Dropし、Prefab化しておきます。
次に、Proxy Rule Setを作成します。ヒエラルキーウィンドウ上で右クリックし、MARS > Proxy Rule Set を選択します。Proxy Rule SetはARのレイアウトと動作を簡潔に記述できるようにするためのオーサリング機能です。Proxy Rule SetのInspectorウィンドウでOpen As Windowを選択すると、ルール一覧が出てきますので、Add Rule をクリックし、ルールを追加します。先ほどPrefab化したProxy Objectをルールの中にDrag&Dropし、Spawn条件に発動させたいオブジェクトを選択します。(Fig.8)
Play Modeに入り、WASDキーでカメラ(ユーザ)を動かし、Device Viewで確認してみます。カメラの動きに合わせて平面が検知され、Proxyで設定した条件の平面が検知されたら、Proxy Rule Setでセットしたオブジェクト(草)が出現したことが確認できました。(Fig.9) 実機にビルドして実際の環境でアプリを動かしてみると、シミュレーション環境でシミュレートした結果と同様の動きになることも確認できます。
XRテスト自動化に向けて
MARSのSimulation EnvironmentにはSession Recordingsというシミュレーション環境内での動きを記録できる機能があります。この機能を利用すると反復的にテストしたり、様々な動作パターンでコンテンツの挙動をテストすることができます。また、複数のSimulation Environmentを利用し、Proxy Rule SetにマッチしたかどうかをテストすることができるSimulation Test Runnerも用意されているようです。
さらに、Unity MARS Companion appというAndroidやiOS端末で利用できるUnity MARSの補助アプリも現在β版が公開されています。このアプリでは、空間から平面などをキャプチャしSimulated Environmentの作成を支援する機能や録画したデータをシミュレーション環境上で再生できる機能が提供されています。
ロバストなテストとその自動化に向けては、テストデータとシミュレーション環境の掛け合わせでテストができるとよさそうです。例えば、シミュレーション環境内をユーザの動きに模して記録したテストデータを多数生成する仕組みや、空間をスキャンするツールのような環境のアップデートをより容易にする仕組みが必要になってくると考えられます。
まとめ
LiDAR搭載デバイスやキャプチャアプリの普及で現実空間のキャプチャがより身近になってきました。今回は、キャプチャしたデータをUnity MARSのオーサリング環境に取り込んで、ARをより現実空間に紐付いた環境で、かつ機械的に扱える実装方法について調査しました。
効率的なXR開発に向けて、オーサリング環境に現実空間の取り込みを容易にする仕組みや現実空間の変化を開発環境にフィードバックする仕組み、空間に何があるのかといったセマンティクスを活用できる仕組みなどまだまだXRの普及に向けた課題はありそうです。 NTTでは、その手の先を見据えて仕組みを創る仕事に興味のある仲間を募集中です。ご連絡お待ちしています。