UnityとMeta Quest2 / Pro でMR表現を試す(2)

# はじめに
この記事は、[UnityとMeta Quest2 / Pro でMR表現を試す(1)](https://qiita.com/b0bmat0ca/items/bc5ce8e38979d4680402)の続きとなります。

Meta QuestでMR表現を実現する技術として、**シーンモデル、シーンキャプチャ、シーンAPI**という概念があります。

:::note info
詳しくは
* https://www.meta.com/ja-jp/blog/quest/mixed-reality-definition-passthrough-scene-understanding-spatial-anchors/
* https://developer.oculus.com/documentation/unity/unity-scene-overview/
:::

大雑把に言ってしまうと、以下のような関係になるのでしょうか。
## シーンモデル
シーンキャプチャで設定された空間にアンカーを設置することで、現実世界のオブジェクトを認識する

## シーンキャプチャ
現実世界の壁や家具など部屋の構造を取り込む

:::note info
現在は手動で行う必要があるルーム設定機能のお話です。
詳しくは割愛しますが、Quest2 / Pro の「設定 > 試験中 > ルーム設定」メニューから壁や家具の設定を行うことができます。
:::

## シーンAPI
シーンモデルをUnityで利用するために提供されているインターフェース

# シーンモデルの利用設定
## シーンアンカーのサポートを許可
Assets > Oculus > OculusProjectConfig
Anchor Support を「Enabled」に設定
![スクリーンショット 2023-03-25 144819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/44129f66-27b2-85bd-c150-7ad0664d6a0f.png)

:::note info
現実世界のオブジェクトにシーンアンカーを設置することで、現実世界のオブジェクトを利用できるようになります
:::

## OVRSceneManagerの設置と設定
Assets > Oculus > VR > Prefabs > OVRSceneManager
このプレファブが、シーンキャプチャで設定した壁や家具を認識して、シーンアンカーを設置してくれます。

:::note info
現在、以下の種類分けがされているようです
* Floor
* Ceiling
* WallFace
* Desk
* Couch
* DoorFrame
* WindowFrame
* Other
* Storage
* Bed
* Screen
* Lamp
* Plant
:::

![スクリーンショット 2023-03-25 145501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/3a1815c2-b183-fe4f-aa63-1a95e265f945.png)

### Plane Prefabの設定
「Floor(床)」「Ceiling(天井)」「Walls(壁)」に設定するプレファブの指定

:::note info
これは、ルーム設定で壁を設定することで決定されます
:::

必ず、シーンアンカー(**OVRSceneAnchor**)のコンポーネントがアタッチされているものを指定します。
ここでは、**SampleFramework** パッケージに含まれているInvisiblePlaneを指定します。
シーンアンカーとコライダーのシンプルな構成です。

Assets > Oculus > SampleFramework > Usage > SceneManager > Prefabs > InvisiblePlane
![スクリーンショット 2023-03-25 151302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/2c5fb394-8166-19b6-3853-b202b916f91c.png)
![スクリーンショット 2023-03-25 151318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/9f724b85-1a11-37b9-e4b4-d82c77a3c3bd.png)


### Volume Prefabの設定
「Floor(床)」「Ceiling(天井)」「Walls(壁)」**以外** に設定するプレファブの指定

必ず、シーンアンカー(**OVRSceneAnchor**)のコンポーネントがアタッチされているものを指定します。
ここでは、**SampleFramework** パッケージに含まれているInvisibleVolumeを指定します。
これもシーンアンカーとコライダーのシンプルな構成です。

![スクリーンショット 2023-03-25 151502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/ea6cd74c-cac8-bff7-8003-498b8224a665.png)
![スクリーンショット 2023-03-25 151540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/157d9fa6-0f7c-2c9d-6e54-f77e7ba12ecf.png)

### 特定の種類に別のプレファブを設定
ここでは、「Desk(机)」に別のプレファブを設定する例を示します。
Prefab Overridesの項目で設定が可能です。

1. InVisibleVolume を設置
![スクリーンショット 2023-03-25 223446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/de865a43-546f-28a4-cd4f-2f566f9fe032.png)
1. Cubeプリミティブを設置し、Colliderオブジェクトと同じ位置に修正
既にコライダーが存在するので、CubeのBoxColliderは削除する
![スクリーンショット 2023-03-25 235802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/11e75847-8154-7d46-b20c-55b162dfbf69.png)
1. InVisibleVolume の名称を適当に変更(ここでは、Deskに変更)
1. DeskをPrefab化
1. HierachyのDeskを削除
1. Prefab OverridesにDeskを設定
![スクリーンショット 2023-03-25 224505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/71f0dfca-b092-8eb1-58aa-9d2d46ced623.png)

# シーンモデルの確認
ここまでで、シーンモデルの設定は完了していますので、コライダーとリジッドボディのついたCGを設置して、ビルドしてみます。

![スクリーンショット 2023-03-25 221736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/d8fe3472-4100-368c-691f-75749f74db1c.png)

床と机が認識されていることがわかるかと思います。

![SceneModel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729904/8226ee50-9a34-a922-a64e-749dec578dba.gif)

参考になれば、幸いです。