【Unity】MetaQuest3のパススルー構築、動作検証
始めに
魚群シミュレーションのプロジェクトでパススルー用のシーンを用意したい。
プロジェクトの状態としては以下の通り
- MetaQuest向けのビルドができる
- Meta XR Core SDKがインストールされている
MetaQuest向けのセットアップについて
こりんさんのサイトを参考に手順通り進めてた思い出💭
(実は別プロジェクトで実験的にパススルーの魚群を作ってたけど、改めてセットアップしなおす🙈)
シーンを作ってOculus > Tools > Building Blocksを開く
Building Blocksから以下の者を追加して、パススルーのシーンを追加した。
- Camera Rig
- Passthrough
- Controller Tracking
- Room Mesh
上記と合わせて魚群シミュレーションをシーンに追加して一応動作した。
一部正しく動作していない箇所として以下の通り、少しずつ対応していく。
- 現実上のColliderが取得できていない
- コントローラーを個体に近づけても逃避行動をしない
- コントローラーの回避行動はしている模様
Room Meshのコンポーネントを見るとdeprecatedとなってた。
貼られているURL(Mixed Reality Utility Kitの概要)に飛ぶとMeta MR Utility Kitを使って下さいとのこと。
Meta MR Utility KitをインポートしてBuilding Blocksを開くと、いくつか要素が追加されてた。
試しにEffectMeshを選択すると、シーンにEffectMeshのほかにMR Utility Kitが追加された。
このオブジェクトが現実空間のメッシュを取得するために必要なGameObject?
https://zenn.dev/link/comments/c4b156ebd23719
- コントローラーを個体に近づけても逃避行動をしない
- コントローラーの回避行動はしている模様
コントローラーから逃げない問題は解決した。
原因はMetaQuest側のメニュー画面を開いた状態で動作確認をしていたため、コントローラーのトラッキング状態が無効になっていたからと推測。
MR Utility KitとEffect Meshをシーン上に追加して、現実シーンのメッシュが読み込まれていることは確認できた。
しかし、魚群がシーンのメッシュを避ける行動はとらないので、Colliderが設定できていないと推測。
EffectMeshコンポーネントに Colliders
という設定項目を確認。
Colliders
にチェックを付けることにより、生成されるオブジェクトにMesh Colliderがアタッチされることを確認した。
いったんオブジェクトのエフェクトがうるさいので消す。
Effect Meshの 消せませんでした 🙈(マテリアルが設定されずピンク色になる)Mesh Material
をNoneに設定すれば消せそう。
// EffectMesh.cs
// only attach MeshRenderer if a material has been assigned
if (MeshMaterial != null)
{
MeshRenderer newRenderer = newGameObject.AddComponent<MeshRenderer>();
newRenderer.material = MeshMaterial;
newRenderer.shadowCastingMode = castShadows ? ShadowCastingMode.On : ShadowCastingMode.Off;
newRenderer.enabled = !hideMesh;
}
引き続きオクルージョンの対応も進めていく。
魚群でDrawMeshInstancedIndirect使っているので調整が必要、かつ動くかが心配。
以下の記事を参考に、オクルージョンで必要となるDepth APIを追加。
仮で魚群にオクルージョンのマテリアルを付けてみたが、上手く動作せず。(Graphics APIを使用しているから?)
かつ、ビルドして動作確認したところかなり72fpsを維持できなかった。
なので、オクルージョンの調査を打ち切る。
今のところのパススルーの問題点 🤔
- 起動直後にオブジェクトを非表示にしたい
- Scene Debuggerから
Show Mesh
みたいな設定をON->OFFして非表示にはできる
- Scene Debuggerから
- 認識したオブジェクトではなく、スキャンしたルーム自体にMeshColliderを設定したい
- 現状は認識したオブジェクトにColliderが設定されるため、魚群が避けるオブジェクトが粗い
- 認識したオブジェクトではなく、スキャンしたルーム自体にMeshColliderを設定したい
- 現状は認識したオブジェクトにColliderが設定されるため、魚群が避けるオブジェクトが粗い
MR Utility
と Effect Mesh
を削除し、Room Mesh
を追加することで、スキャンしたルームのメッシュにColliderを付けることができた。
- 起動直後にオブジェクトを非表示にしたい
- Scene Debuggerから Show Mesh みたいな設定をON->OFFして非表示にはできる
Room Mesh
では Effect Mesh
とは異なる描画であるため上記問題は解決したが、Room Mesh
で描画されるワイヤーフレームの消し方が分からない 🤔
このワイヤーフレームがあるおかげ隠れた魚群は表示されないのは凄く良いけど 💭
Room Mesh では Effect Mesh とは異なる描画であるため上記問題は解決したが、Room Mesh で描画されるワイヤーフレームの消し方が分からない 🤔
半透明Shaderを自作してRenderQueueを1900に設定、これを各RoomMeshのPrefabに設定した。
Shader
雑に編集したコードになるのでご了承ください 🙇
Shader "Unlit/InvisibleRoomMesh"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(0, 0, 0, 0);
}
ENDCG
}
}
}
これによりワイヤーフレームを描画せず、裏側に隠れた個体を非表示にできた。
メッシュを貼った箇所に魚群が隠れることを確認。
いったんこれにて検証は以上となる。
ひとまずやったことまとめ
- Meta MR Utility Kitを入れた
- これを入れたことにより、Building Blocksの
Room Mesh
が動作した可能性
- これを入れたことにより、Building Blocksの
-
Room Mesh
をシーンに追加 - 表示されるメッシュに透明+RenderQueueが低いマテリアルを設定
- ルーム上に貼られたメッシュに魚群が隠れる