MRが楽しい

MRやVRについて学習したことを書き残す

MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う その14(深度センサを用いたオクルージョンを行う)

本日はMetaQuest3の技術調査枠です。
MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う手順を記事にします。
本記事は深度センサを用いたオクルージョンを行う手順です。

前提条件

本記事では以下の記事で作成したパススルーを有効にした Unity プロジェクトを基に設定を行います。
bluebirdofoz.hatenablog.com

Depth API

Depth APIはヘッドセットの視点からのリアルタイムな環境深度推定をアプリケーションに反映する新機能です。
アプリ内の仮想コンテンツが現実の物体と視覚的に相互作用するため、ユーザにより一貫した現実感を与えます。
Build Believable Mixed Reality Experiences with Mesh API and Depth API

本記事を執筆した2023/12/31時点ではDepth APIを利用するパッケージは以下のGitHubからインポートします。
今後パッケージの提供方法が変更される可能性がある点に注意してください。
github.com

Depth APIを利用する

Depth APIを利用するには以下の作業が必要になります。
1.パススルー機能を有効にする
2.GraphicsAPIはVulkanを利用する
3.RenderingModeをMultiviewに設定する
4.Depth APIパッケージをインポートする
5.オクルージョンの管理プレハブを追加する
6.OVRManagerでシーンのサポートを必須に設定する
7.各オブジェクトのシェーダをDepth APIに対応したシェーダに変更または差し替える

このうち、1~3は前回記事までの作業で実施済みのため、本記事では4の手順から作業を行います。

Unityバージョンを2022.3以降にする

Depth APIを利用する場合はUnityバージョンを2022.3以降にする必要があります。
今回はプロジェクトのUnityバージョンを2022.3.12f1に更新しました。

更新後、[Disable Multi-Threaded Rendering]の設定ダイアログが表示されます。
Questではマルチスレッドレンダリングが有効である必要があるので、本ダイアログの設定反映は行わず無視します。

Depth APIパッケージをインポートする

メニューから[Window -> Package Manger]でPackageManagerウィンドウを開きます。

左上の[+]ボタンのプルダウンから[Add package from git URI...]を選択します。

URIの入力欄が表示されるので以下のアドレスを指定して[Add]を実行します。

https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi

これでDepth APIパッケージがインポートできます。

プロジェクトでURP(ユニバーサルレンダーパイプライン)を利用している場合はさらに以下のシェーダーセットを追加でインポートする必要があります。
本記事のプロジェクトはビルトインレンダーパイプラインを利用しているため、追加のインポートは行いません。

https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi.urp

オクルージョンの管理プレハブを追加する

シーンにオクルージョンを管理するプレハブを追加します。
以下のプレハブをシーンにドラッグして配置します。

Packages/Depth API/Runtime/Core/Prefabs/EnvironmentDepthOcclusion.prefab

追加したオブジェクトのEnvironmentDepthOcclusionControllerコンポーネントでオクルージョンの種類を設定できます。
[Occlusion Type]で以下の3種類のオクルージョン設定を指定できます。今回は[Soft Occlusion]を指定しました。

No Occlusion:オクルージョンなし
Hard Occlusion:オクルージョンの境目を明確にする
Soft Occlusion:オクルージョンの境目をぼかす


OVRManagerでシーンのサポートを必須に設定する

シーンのサポートを設定して、空間情報へのアクセスを許可します。
OculusProjectConfig.assetsを開き、[General -> Scene Support]の項目を[Required]に設定します。

各オブジェクトのシェーダをDepth APIに対応したシェーダに変更または差し替える

最後にシーン内のオブジェクトのシェーダをDepth APIに対応したものに差し替えます。
Depth APIパッケージには以下の基本シェーダに対応するカスタムシェーダが付属しています。

基本シェーダ 対応するDepth API用シェーダ
Standard Occlusion Standard
ParticleStandardUnlit OcclusionParticleStandardUnlit

今回は以下のシーンに配置されているCubeオブジェクトのシェーダを差し替えます。
このCubeオブジェクトはStandardシェーダを使用しています。

対応するOcclusion Standardシェーダを利用するマテリアルを作成します。
Assetsフォルダ上で右クリックから[Create -> Material]で新規マテリアルを作成します。

作成したマテリアルを選択し、Inspectorビューの[Shader]プルダウンを開きます。

[Meta -> Depth -> BiRP -> Occlusion Standard]を選択します。
これでOcclusion Standardシェーダを利用するマテリアルが作成できました。

作成したマテリアルをCubeオブジェクトにドラッグして反映します。

ビルドと動作確認

これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

アプリを起動時に空間情報へのアクセスを確認するダイアログが表示されます。
[許可]を選択してアプリを起動します。

Cubeオブジェクトに手をかざすと以下の通りオクルージョンされます。

Cubeオブジェクトを壁の向こう側に掴んで移動すると、壁でオクルージョンされます。
ただし表示を遮断しているだけなので壁の向こうにオブジェクトが存在してもポインターで掴むことはできます。