土鍋で雑多煮

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

【Meta Quest3】パススルーの部屋の天井の先にバーチャル空間を表示する【URP対応】

どうも、土鍋です。

今回はQuest3のパススルーで部屋の天井をバーチャル空間と繋げる表現を実装しました。

ARコンテンツとして現実とバーチャルをつなぐポータルはよくありますが、それをQuest3固有のシーン把握の機能と組み合わせてやってみました。

おおむねこちらの記事を参考にさせていただきました。ありがとうございます。

knowledge-swimmer.com

また、イワケンラボの方々にもアドバイスを頂いて、うまく動作するものができました。

Meta XR All-in-One SDKの導入とBuilding Blocks

今回、Building BlocksやSceneMeshなどの機能を使用するので以下の記事を参考に導入してください。

MR開発ではMeta XR Simulatorを使うとビルドする必要がなく、作業効率が上がるのでそちらも試してみてください。

donabenabe.hatenablog.com

マテリアルを変更する

上の記事でBuilding BlocksのCamera Rig、Passthrough、Room Modelを追加するところまでを行ってください。

ここまででパススルーされた部屋の壁や物に青いマテリアルが上書きされる状態になると思います。

ここからバーチャル空間を見えるようにしていきます。

壁のマテリアル

OVR Scene ManagerのPlane Prefabにセットされているオブジェクトのマテリアルを変更する必要があります。

Packages/com.meta.xr.mrutilitykit/Core/Materials/InvisibleOccluder.mat

このマテリアルに変更することで、透明なマテリアルですが、実際の部屋のパススルーのみを映し、バーチャル側のものは遮蔽されて見えなくなります。

補足すると、このマテリアルはRenderQueueが1998なので、デフォルト2000の多くのオブジェクトより先に描画されるということになるようです。

天井のPlane

天井は次のPrefabを用います。

Packages/com.meta.xr.mrutilitykit/Editor/BuildingBlocks/AnchorColliderSpawner/Prefabs/[BB] InvisiblePlane.prefab

このPlaneはMeshが無くSceneAnchorのみがあるので、バーチャル側を見ることができるようになります。(つまり見た目がない)

次にInvisiblePlane PrefabをOVR Scene ManagerのPrefab Overridesにセットします。
今回は天井をバーチャル空間にしたいので"CEILING"を指定します。

ここまでで、このようにバーチャル側の物体が天井に描画されるようになります。
が、Skyboxが見えません。

疑似Skyboxを作る

CenterEyeAnchorのCameraのBackground TypeをSkyboxにすればSkyboxが描画されますが、今度はパススルー映像が見えなくなってしまうので、擬似的なSkyboxを作ることで対応しました。

booth.pm

こちらを用いて、巨大な球体内にSkyboxTextureを描画して、擬似的なSkyboxを作ることができました。

これによって、画像のように天井の先にバーチャル空間を表示することができました!

感想

ここまで読んでいただきありがとうございます。
意外とシンプルな実装でしたが、URPかつQuest3での実装となると、なかなか記事が見つからず様々な手法を試してやっと実現できた感じではあります。
具体的には、Render Texture、ステンシル、カスタムShaderなどなど…
知らない領域の知識が多少ついたので、まあ回り道だったけど良かったかなと思います。

この記事が参考になれば幸いです。

参考記事
- Meta Quest の パススルー表示とSkyboxの共存 | Knowledge Swimmer メモ
- Meta Quest の パススルーとオクルージョン | Knowledge Swimmer メモ
- MRTKではじめるPortal表現 | ドクセル