MRが楽しい

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

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

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

前提条件

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

Depth API

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

要件

Depth APIを利用するには以下の要件を満たしている必要があります。
・Unity 2022.3.1 または 2023.2 以降
・Meta XR Core SDK v67 以降
・Oculus XR Plugin 4.2.0 以降
・Depth API パッケージ
・Meta Quest 3 デバイス

Depth APIを利用する

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

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

オクルージョンの管理コンポーネントを追加する

以下のEnvironmentDepthManagerコンポーネントをシーン内の任意のオブジェクトにアタッチします。

Packages/MetaXRCoreSDK/Scripts/EnvironmentDepth/EnvironmentDepthManager.cs

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

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

[RemoveHands]は仮想ハンドを表示するための手首部分の深度マップ除去をサポートします。デフォルトのチェックを外した状態だと、手の部分も通常通り深度マップが設定されます。

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

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

更にOVR Managerコンポーネントの[Permission Requests On Startup -> Scene]にチェックを入れます。
これにより、起動時にシーンアクセスの要求が実行されて許可ダイアログが表示されるようになります。

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

今回は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

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

シーン内のオブジェクトのシェーダをDepth APIに対応したものに差し替えます。
Depth APIパッケージに含まれる以下の基本シェーダに対応するカスタムシェーダを利用します。

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

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

作成したマテリアルを選択し、Inspectorビューの[Shader]から[Occlusion Standard(Meta/Depth/BiRP)]を選択します。
これでOcclusion Standardシェーダを利用するマテリアルが作成できました。

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

ビルドと動作確認

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

アプリ起動時に空間情報へのアクセスを要求するダイアログが表示されるので[許可]を選択します。
Cubeオブジェクトが以下の通り現実の物体でオクルージョンされます。

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

バイアスの設定方法

DepthAPIではオクルージョンの衝突距離を調整するための深度バイアスがサポートされています。
深度バイアスを設定したい場合はOcclusionDepthBiasコンポーネントを対象のRendererを持つオブジェクトにアタッチします。


仮想ハンドの無効化

オクルージョンを利用する際、仮想ハンドを無効化したい場合があります。
プロファイルの[Input]タブを開き、[Articulated Hand Tracking]のプロファイルをクローンして編集可能にします。

[Hand Mesh Visualization Modes]と[Hand Joint Visualization Modes]のプルダウンから[Player]のチェックを外します。
これで実機環境では仮想ハンドが表示されなくなります。

過去バージョンの利用手順

MetaXRSDKのv67以降ではDepthAPIの利用スクリプトSDKに含まれています。
v66以前は以下のGitHubからライブラリをインポートする必要がありました。
github.com

過去バージョンでの利用手順の詳細は以下の記事を参照ください。
bluebirdofoz.hatenablog.com