Meta Questパススルー：天井だけSkyboxを表示する方法

# Meta Questパススルー：天井だけSkyboxを表示する方法

Meta Questのパススルー機能は、現実世界と仮想空間を融合させ、没入感のある体験を提供します。通常、パススルー設定では現実世界のメッシュをオクルージョンとして利用しますが、時には特定の領域（例：天井）には現実世界の表示ではなく、仮想のSkyboxを表示したい場合があります。

本記事では、OVRSceneManagerのOverride機能とLighting設定を組み合わせて、天井部分にのみSkyboxを表示し、それ以外の壁面と床にはパススルーのオクルージョンを適用する具体的な手順を解説します。

1. パススルーとSkyboxの組み合わせとは？
1. 環境光（Lighting）の設定
1. OVRSceneManagerの設定とPrefabの準備
1. OVRCameraRigとCameraの設定

## 1. パススルーとSkyboxの組み合わせとは？
Meta Questのパススルー機能は、ヘッドセットのカメラ映像をリアルタイムでユーザーの視界に表示し、現実空間と仮想オブジェクトを融合させます。しかし、常に現実世界をそのまま表示したいとは限りません。例えば、天井部分だけは仮想のSkyboxを表示して、広大な空や宇宙、あるいはファンタジーな世界観を表現したいといったニーズがあります。

この設定は、現実世界のメッシュを認識するOVRSceneManagerの挙動を調整し、同時にUnityのLighting設定でSkyboxが適切に表示されるようにすることで実現します。これにより、ユーザーは足元や周囲の壁は現実世界として認識しつつ、頭上には無限に広がる仮想空間を感じることができるようになります。


## 2.環境光(Lighting)の設定
Skyboxを適切に表示しつつ、それ以外の部分のパススルー映像に影響を与えないようにLightingを設定します。

・Lightingウィンドウを開く：
Window > Rendering > Lighting を選択し、Lightingウィンドウを開きます。

・SceneタブのEnviroment設定：
![スクリーンショット 2025-05-25 18.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031200/cfabe3c7-7265-473e-b4db-530c67469584.png)

Lighting Settings Asset: Noneに設定します。これにより、シーン全体の照明設定がリセットされ、Skyboxの影響をより細かく制御できます。
Skybox Material: ここに表示したいSkyboxマテリアルを設定します。Assetsからプロジェクト内のSkyboxマテリアルをドラッグ＆ドロップするか、セレクターから選択してください。
Sun Source: Noneに設定します。これにより、Skyboxからの太陽光の影響を排除し、シーン全体の照明をパススルーに最適化します。
Source: Colorに設定します。
Color: カラーピッカーでR:0, G:0, B:0, A:0（完全に透明な黒）に設定します。これにより、環境光がシーン内のオブジェクトに影響を与えないようになります。


## 3. OVRSceneManagerの設定とprefabの準備
現実世界のメッシュを認識し、特定の平面（天井以外）にのみオクルージョンを適用するようにOVRSceneManagerを設定します。

OVRSceneManagerの追加と設定：

シーン内の任意のGameObject（例: 空のGameObject）に、OVRSceneManager.csスクリプトをアタッチします。
同じGameObjectにOVRSceneModelLoader.csスクリプトもアタッチします。
OVRSceneManagerのインスペクターで、Occluding PlaneとOccluding Volumeのチェックボックスにチェックを入れます。
Plane Prefab: Noneに設定します。
Volume Prefab: Noneに設定します。
![スクリーンショット 2025-05-25 17.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031200/c4e85bb5-b03b-434d-af09-435172d8b102.png)


これらのPrefabをNoneにする理由:
通常、OVRSceneManagerはPlane PrefabとVolume Prefabで指定されたPrefabを元に、スキャンされた現実世界の平面（壁、床など）やボリューム（部屋の形状）に自動的にオクルージョン用のメッシュを生成します。しかし、今回は天井にオクルージョンを配置したくないため、デフォルトの自動生成を防ぐためにこれらのPrefabをNoneに設定します。これにより、Scene APIがスキャンしたメッシュをUnity上で可視化・オクルージョンとして利用する際の、自動的なPrefabのインスタンス化を抑制します。

特定の平面のみにオクルージョンを適用（Override機能）：
OVRSceneManagerコンポーネントのOverridesセクションを展開します。

+ボタンをクリックして新しいOverrideを追加します。
Target: WALL_FACE を選択します。
Prefab: ここに、オクルージョンとして機能させたいOccludingPlaneのPrefab（DepthOnlyMaterialやBoxColliderが設定されたもの）を設定します。
もう一度+ボタンをクリックして新しいOverrideを追加します。
Target: FLOOR を選択します。
Prefab: こちらにも、同じくOccludingPlaneのPrefabを設定します。
Overrideを設定する理由:
OVRSceneManagerのOverrides機能を使用することで、特定のSceneラベル（例: WALL_FACE、FLOOR、CEILINGなど）に対して、どのPrefabを生成するかを細かく制御できます。
今回は、天井（CEILING）には何もPrefabを生成させず、Skyboxを表示させたいので、Plane PrefabをNoneにしています。その代わりに、壁面（WALL_FACE）と床（FLOOR）に対しては、明示的にオクルージョン用のOccludingPlaneを生成するようにOverrideを設定することで、必要な箇所にのみオクルージョンを適用します。これにより、天井はSkyboxが描画され、壁と床はパススルー映像のオクルージョンとして機能するようになります。


## 4. OVRCameraRigとCameraの設定
パススルー映像とSkyboxが適切に合成されるように、カメラとパススルーレイヤーを設定します。

OVRCameraRigの設定：

シーン内のOVRCameraRigを選択します。
OVRCameraRigにOVR PassThroughLayer.csスクリプトがアタッチされていることを確認します。もしアタッチされていなければ、追加します。
OVR PassThroughLayerコンポーネントのPlacementをUnderlayに設定します。これにより、パススルー映像が仮想オブジェクトの下に描画されます。
![スクリーンショット 2025-05-25 18.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031200/612e2bd8-be16-4cde-805d-3b9b0ae1e205.png)



CenterEyeAnchor内のCameraコンポーネントの設定：

OVRCameraRigの子オブジェクトであるCenterEyeAnchorを選択し、その中のCameraコンポーネントを選択します。
Clear FlagsをSkyboxに設定します。これにより、カメラが描画する際に、背景として設定したSkyboxが表示されるようになります。
Backgroundの色をR:0, G:0, B:0, A:0（完全に透明な黒）に設定します。これにより、パススルー映像とSkybox、そして仮想オブジェクトが適切に合成されます。
![スクリーンショット 2025-05-25 18.00.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031200/4b8c571b-9ec4-4034-aa1f-c5887736381b.png)


以上の設定を行うことで、Meta Questのパススルー環境において、壁面と床は現実世界のオクルージョンとして機能しつつ、天井部分には設定したSkyboxがシームレスに表示されるようになります。これにより、よりクリエイティブで没入感のあるMR体験を提供することが可能になります。