こんにちは、くのへ@MasazaneKunoheです。
今日はMeta Quest3のパススルー機能の延長戦上である、現実世界と仮想空間を融合させる方法(MR化)を解説します。
はじめに
下の動画を見て下さい。左の動画は机の裏にボールが落ちても見えていますよね。右の動画は机の裏に落ちたらボールが見えなくなります。でもボールは消えたわけではなく、上から覗き込むとそこにあります。
これは現実世界と仮想空間が融合した状態(MR)であり、Meta Quest3のパススルー機能の神髄になります。
開発方法
まずは以前の記事の通り、パススルー機能を使う設定を行ってください。その状態を前提に以下の記事の通り設定を行えばMR化が可能です。
①マテリアルを作成する
下図①の通り、Projectウィンドウの+ボタンを押して、Materialを新規作成しSceneModelPassThroughという名前にします。(私はAssetsの中にMaterialsというフォルダを作ってその中にMaterialを纏めて保存しています)。
このMaterialはいたって普通のMaterialです。特別なものではありません。
新規作成したマテリアル「SceneModelPassThrogh」のインスペクターウィンドウの一番上を見ると、ShaderがStandardになっていますね。これをクリックし、「MixedRality」の中の「 Selective Passthrough」に変更します。(下図①②、下下図①)
SelectivePassthroghに変更したら、インスペクターウィンドウのInflationを0.003に、Render Queueを4000に変更します(下図①②)。
さらに、Blend ColerをReverseSubtractからSubtractに変更します。(下図①、下下図①)
これでMaterialの設定は完了です。
一体何をやっていたかは、後から解説しますので、とりあえず呪文だと思ってこれをやってください。
②Global Mesh Renderer Collider Depthを作る
次に、Global Mesh Collider Renderer Depthという「当たり判定&レンダリング」の機能を持たせたものを作ります。
下図のようにヒエラルキーウィンドウのOVRSceneManagerを選択し(下図①)、インスペクターウィンドウのOVR Scene ManagerのPrefab Overrides欄のGlobal Mesh Colliderをクリックします(下図②)。
すると、プロジェクトウィンドウのGlobal Mesh Colliderがパッと表示されます。
Global Mesh Colliderのすぐ下にGlobal Mesh Renderer Colliderがあると思いますので、これを見つけます(下図③)。
そして、このGlobal Mesh Renderer Collider を複製し(:選択した状態でCtrl + D)、複製したものに「Global Mesh Renderer Collider Depth」と名前を付けます(下図①参照)。
そして、この複製したGlobal Mesh Renderer Collider Depthを選択し(下図①)、インスペクターウィンドウのMesh Rendererを開きます。そのMesh RendererのMaterial欄に先ほど作成したSceneModelPassThroghをドラッグアンドドロップして設定します(下図②)。
これでGlobal Mesh Renderer Collider Depthの作成は完了です。
先ほど作った「SceneModelPassThroghマテリアル」がレンダリングされ、かつ当たり判定のあるGlobal Meshの完成です。
③OVRSceneManagerのGlobal Meshにセット
では、今作ったGlobal Mesh Renderer Collider Depthをセットしましょう。
ヒエラルキーウィンドウのOVRSceneManagerをクリックし、インスペクターウィンドウのOVR Scene Managerを開きます。そして、Prefab OverridesのGLOBAL_MESH欄に先ほど作ったGlobal Mesh Renderer Collider Depthをセットします。
これで、設定完了です。
MetaQuest3に書き込んでみると、冒頭で紹介した動画のように、3Dスキャンした物体の裏側に仮想空間のオブジェクトが回り込んでくれるようになります。
MR化ヨシ!!!
解説
この件はちょっと難しいと思います。特にマテリアルの設定が何やっているのか分けわからなかったと思います。
基本的には呪文だと思って設定すればよいと思いますが、簡単に解説します。
まず、以前の記事でサッと触れましたが、パススルー機能設定で「Underlay」にすると、以下の様な順番のレイヤーになります。つまり、3D-CGが一番前のレイヤーになるので、どういう前後関係であっても現実世界の画像は3D-CGの裏面に来ます。
一方、Meta Quest3は部屋をスキャンして3Dデータとしてヘッドデバイス内に記憶しておく機能があります。この3Dデータは3D-CGの世界のデータになります。
例えばソファをスキャンしていたら、Unityで作った3Dオブジェクトと、3Dスキャンメッシュデータが3D-CGの仮想空間内に存在することになります(下図参照)。
これらは同じ3D-CGであるため、重ね合わせ可能です。
この3Dスキャンメッシュデータに、現実世界の画像をレンダリングしてみましょう(下図)。
これであれば、3D-CGレイヤーで重ね合わせが出来るというわけです。
最終的に、このようなイメージで重ね合わせが可能となるわけです。
これを行ったのが「マテリアル」の設定で、ShaderをMRのSelectivePassthroughにしたことで、このマテリアルは現実世界の画像をレンダリングすることになります。(下図①で設定したやつです)
これを、Global Meshのレンダリングマテリアルとしてセットしたので、現実世界の裏側に3D-CGが回り込むということが実装されたわけです!
なお、SceneModelPassThroughマテリアルでInflationとRenderQueueを書き換えました(下図①②)が、このInflationは対象のメッシュにピッタリテクスチャを付けるのではなく、若干大きめに張り付けることを意味し、RenderQueueを2000⇒4000に変えたのは3D-CGレイヤーの中でも手前側のレイヤーを使うという意味を持たせるものです。今一つ???だと思いますが呪文だと思って変更しましょう。
今日はMeta Quest3 パススルー機能で現実世界と仮想空間を融合(MR化)させる方法を解説しました。
これをやってみると、感動します。現実と仮想空間が融合したことが感じられると思います。
ではまた別の記事で会いましょう。
ではでは~
🦅バサバサ~