土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

Quest3のMesh APIやDepth APIでMR開発を始めよう

どうも、土鍋です。

本記事は、Iwaken Lab.アドベントカレンダー 17日目の記事です。
昨日はソラシドさんの 毎日モデリングやってみた でした。毎日チャレンジした人は圧倒的成長しているイメージあるんですよね~。毎日続けるってそれだけでもすごいので、私も見習わなきゃですね…

さて、今回はQuest3に搭載された深度センサーを活用するMesh APIやDepth APIを紹介します。ついでに最近のSDK周りのアプデにも触れてます。

新しいMetaのSDK

今までMeta Questの開発ではOculus Integrationが使用されてきましたが、v59より非推奨になり、新しくUPM対応したSDKが登場しました。Oculus Integrationは普段使わないものもあってかなり重いパッケージの印象がありましたが、新SDKからはそれぞれの機能別にインポートできるようになりました。
特にMeta XR Core SDKVR開発の基礎機能のみに絞られ、これだけで簡単なVR開発はできます。
Oculus Integrationの後継という意味ではMeta XR All-in-One SDKがそれにあたると思います。これをインポートすることで、複数のパッケージが自動的にインポートされる仕組みになっています。

assetstore.unity.com

Meta XR Simulator

MR開発において、面倒なのはデバッグです。Unity'上には現実のパススルーは表示されないのでそのままではビルドしないとデバッグできません。 そこで便利なのが「Meta XR Simulator」です。

assetstore.unity.com

インポートすると、Oculus → Meta XR SimulatorからActivateすることでPlayしたときに起動するようになります。 さらに、Synthetic Environment Serverからパススルーで見える現実空間をシミュレートできるようになります。これによって相当デバッグが行いやすくなるのでぜひ使ってみてください。

↑UnityのGameViewではパススルー映像は見ることができないが、
↓Meta XR Simulatorでは確認できる。

Building Blocks

Oculus Integrationでは用意されたPrefabを置くことでVRのPlayerをセットアップしていましたが、v57からはBuilding Blocksという機能が追加され、簡単に必要な機能を選んでセットアップできるようになりました。

Mesh API

Mesh APIは深度センサーで取得した部屋のデータからメッシュを生成するものです。

Scene Mesh | Oculus Developers

サンプルとして面白いのはPhanto。

github.com

使用方法

Building BlocksのCamera Rig、Passthrough、Room Modelを追加してください。これだけでMesh APIを試せます。

PlaneとVolumeというものがOVR Scene Managerにセットされています。
Planeは壁や床、天井といった部屋の形状を形作る平面を示します。
Volumeは机や椅子といった家具を示すCubeのことを示します。

Meta XR SimulatorのRoomでテストするとPlaneとVolumeの動作が確認できます。※後述のGlobal Meshの動作確認は現時点ではできなかった。

Global Mesh

Global Meshは部屋の3Dスキャンデータをそのままメッシュ化できるものです。現実世界に仮想のオブジェクトが干渉するようなものを制作する際に必要になる機能です。Volumeだけでは机や椅子など用意された大きい家具にしか対応できません。しかし、 スキャンデータそのままであるGlobal Meshを使うことでコップやモニターといった小物にも対応できるようになります。

セットアップ

空のGameObjectを作りコンポーネントを次のようにつけてください。

OVRSceneManagerのPrefab Overridesに項目を追加し、先程のGameObjectを選択します。そして上のプルダウンはGLOBAL_MESHを選択します。このようにすることで、部屋のスキャンデータをメッシュとして利用することができます。

分かりづらいですが、壁だけでなく雑に置かれた雑貨にもメッシュが貼られています。

※2024/03/28追記
Meta XR SimulatorではGlobal Meshは機能しないので、実機にビルドして確認する必要があります。

Depth API

Depth APIは家具や腕の後ろに仮想の3Dオブジェクトが遮蔽されるオクルージョンを可能にする機能です。MRにおいてオクルージョンがないと没入感が損なわれますのでこれは重要です。 Mesh APIとの違いはこちらはリアルタイムに処理が可能であるというのが大きいでしょう。

Depth API for Unity | Oculus Developers

サンプルプロジェクト

github.com

家具や腕に3Dオブジェクトが遮蔽されているのが分かると思います。 Hard Occlusionは境界がカクカクになり、Soft Occlusionでは境界がぼやけます。個人的に動かしたときに違和感がなかったのはSoft Occlusionでした。

導入方法

公式導入方法解説↓
https://github.com/oculus-samples/Unity-DepthAPI?tab=readme-ov-file#using-the-commetaxrdepthapi-package

Packages/Depth API/Runtime/Core/PrefabsにあるEnvironmentDepthOcclusionをシーンに設置し、オクルージョンを適用させたいオブジェクトにオクルージョンシェーダーをセットすることでオクルージョンさせることができます。

シェーダーに関してはBuilt-inとURPで差があるので注意してください。
リンクから飛んだ先にカスタムシェーダーでのオクルージョンの適用方法も書いてあるので参考にしてください。

まとめ

本当はShered Spatial Anchorsの記事書きたかったんですが、まだ理解が浅い&記事書く時間が足りなかったので、Quest3のMesh APIやDepth APIを紹介しました。Quest3はめちゃめちゃポテンシャルあると思っているので、Quest3の機能をフルに生かしたMRゲームの開発を始めました(いつか公開したいなぁ…)

明日18日はユーゴさんの記事です。お楽しみに!

参考

Mesh API と Depth API による Meta Quest 3 のMRエクスペリエンスの構築|npaka

Quest3MR開発入門|jig.jp engineers