概要
Questのパススルーの機能が拡充され、MRアプリとして色々と利用できるようになっているので、その機能を利用するためのメモを書いていきます。具体的には、以下の動画のように、自分で設定したオブジェクト(机や椅子、本棚など)を制御して「自分の部屋をVR空間にしていく」ための方法のメモです。
QuestのVRルームでオブジェクトを個別に認識してMRとして利用してみた。面白いもの作れそう#Quest2 #QuestPro #VR #MR #AR #Unity #madewithunity pic.twitter.com/4DNevIMQzd
— edom18@XR / MESON CTO (@edo_m18) 2022年12月29日
ちなみにこの機能を実装するにあたって、Metaが提供している The World Beyond を参考にしました。さらにうれしいことにそのUnityプロジェクトはGitHubに公開されているので興味がある方はぜひ見てみてください。
動作サンプル
また、今回のサンプルの機能部分(パススルーの有効化など)についてはGitHubにアップしてあるので、実際に動くものを見たい場合はこちらをダウンロードして確認ください。
パススルーの設定
まず、冒頭の動画のようなコンテンツを作成する場合、ビデオパススルーを有効化する必要があります。いくつか手順が必要で、特にエラーなども出ないので注意が必要です。
ここでは必要な要素のみを取り上げますが、以前に、より詳細な記事を書いているのでそちらも合わせて参照ください。
※ なお、以下の記事を書いたときはまだ実験的機能だったために必要だった処理もありましたが、現在はいくつかは行わなくても大丈夫になっているようです。
パススルーを有効化する
パススルーを有効化するには以下の手順を実行してください。
Player Settings
にて以下を設定します。
- Scripting Backendを
IL2CPP
にする - Target Architectureを
ARM64
にする
OVRCameraRig
Prefabにあるコンポーネントの OVRManager
の以下の項目を設定します。
Anchor Support
をEnabled
にするPassthrough Capability Enabled
のチェックをオンにするEnable Passthrough
のチェックをオンにする
※ 画像内の Quest Features
は厳密には OVRProjectConfig
という ScriptableObject
でできたアセットの設定を OVRManager
が分かりやすく表示しています。そのため、本来の設定はそのアセットに保存されます。
OVRCameraRig
オブジェクトにOVRPassthroughLayer
コンポーネントを追加するOVRPassthroughLayer
のPlacement
をUnderlay
に変更する
上記までを設定することでビデオパススルーが有効化され、利用できるようになります。
各リアルオブジェクトを利用する
次に、リアルオブジェクト(VR Room機能で設定した壁や窓など)をシーン内に表現するための設定を行います。
OVRSceneManager をシーンに配置する
Meta XR Utilities
に含まれている OVRSceneManager
プレファブをシーン内に配置します。設置したら所定のパラメータに適切にオブジェクトを設定します。(詳細は後述します)
OVRSceneModelLoaderをアタッチする
OVRSceneManager
をアタッチしたオブジェクトに、追加で OVRSceneModelLoader
をアタッチします。
リアルオブジェクトを表す OVRSceneAnchor
OVRSceneManager
のインスペクタに設定するオブジェクト(Prefab)は OVRSceneAnchor
コンポーネントを持っている必要があります。このコンポーネントがリアルオブジェクトを表す単位となります。スクリプトのコメントを引用すると以下のように説明されています。
A scene anchor is a type of anchor that is provided by the system. It represents an item in the physical environment, such as a plane or volume. Scene anchors are created by the OVRSceneManager.
シーンアンカーはシステムから提供されるアンカーのタイプです。物理環境の平面やボリュームなどのひとつのアイテムを表現します。シーンアンカーは
OVRSceneManager
によって生成されます。
上記画像の意味をひとつひとつ見ていきましょう。
平面用Prefab Plane Prefab
ひとつ目の項目は Plane Prefab
です。これはリアルオブジェクトのうち、平面として表されるオブジェクト用に利用されます。例えば机や椅子などの平面です。また壁や天井なども平面で定義されるため、このPrefabが利用されます。( Instantiate
される)
ボリューム用Prefab Volume Prefab
もうひとつの Volume Prefab
は、ボリューム、つまり体積を持つ単位で利用されるPrefabです。例えばVR Room機能で Other
で設定され、VR Roomのプレビューで立方体で表されるオブジェクトがこれに該当します。
それぞれのPrefabはオーバーライドできる
最後の Prefab Overrides
は、壁や天井など、特定のリアルオブジェクトを専用のPrefabでオーバーライドするためのものです。例えば、床はこのPrefabを利用して特殊なテクスチャが貼ってあるようにする、などの使い方ができます。
Prefabの構成
OVRSceneManager
に設定するPrefabの構成は以下の通りです。
Plane Prefabの構成
Plane Prefab
に設定しているPrefabは以下の構成になります。トップオブジェクトに OVRSceneAnchor
を付け、その下にMeshを配置しているだけですね。ただ、Meshに設定するマテリアルは Transparent
のQueueより少し早めに描画しておく必要があるようです。
Volume Prefabの構成
Volume Prefab
に設定しているのは以下の構成になります。 Plane Prefab
と同様、トップオブジェクトに OVRSceneAnchor
を付け、その下に Parent > Mesh
という階層でオブジェクトを配置しています。 Parent
はコンポーネントがなにもないオブジェクトでおそらくPivot的に使われるものと思われます。そして最下層のMeshは Plane Prefab
と異なり、Cube型のオブジェクトを配置しています。
Prefab Overridesに設定するPrefabの構成
最後に、オーバーライドするPrefabの構成についてです。こちらは以下のような構成になっていました。上記構成と共通の設定として、 OVRSceneAnchor
を追加し、逆に上記の構成と異なる点としては OVRScenePlaneMeshFilter
コンポーネントを追加しています。Meshに設定しているマテリアルは上記のものと同様です。
マテリアルについて
Prefabに設定しているマテリアルですが、Queue以外に色を調整する必要があります。具体的には、
- 色を黒にする
- アルファを0にする(= 完全透明にする)
理由としては、色は加算されるため白にすると真っ白になってしまいます。そしてアルファの値はパススルー映像の透過させるために0にしておく必要があります。
壁を透過させてVRのように見せる
冒頭の動画のように、パススルーで見ているところを透過してVRのように見せる方法はとてもシンプルです。生成された壁のオブジェクトは Plane Prefab
に登録された汎用なものか、あるいはオーバーライドされたPrefabで構成されています。Planeの名前の通りただの平面オブジェクトなのでそれを「非表示」にしてしまえば遮蔽するものがなくなり、その奥に広がっているVR空間が顔を出す、というわけです。
また、オーバーライドできることを利用して、例えば壁には特殊なコンポーネントを付与しておき、ポイントされたら円形の形にくり抜いて奥を見せる、などの細かな制御を行うことができるでしょう。
まとめ
実際に触ってみて思ったのは、大部分のところをMeta XR Utility側でやってくれるので本当に必要なところだけを実装するだけでOKでした。大まかな仕組みは理解したのでこれを利用してコンテンツをひとつ作ってみようと思います。
実際のコンテンツの場合は「どのドア」とか「どの窓」など複数登録できるオブジェクトをどうやって有効利用するかを決めないとならないのでもうひと手間かかるかなとは思っています。とはいえ、大枠として「ドアがここ」などが分かるのはMRコンテンツを作成する上でかなり大きな意味を持つと思います。ぜひみなさんも面白いアイデアが思いついたら実装してみてください。