実現したいこと
XR Device Simulatorで壁や床などにRry をヒットさせてそのpositionを参照してPrefabを出現させたいです。
前提
UnityでMeta Quest 3向けのMRアプリを開発しています。
XR SimulatorのSynthetic Environment上で、EnvironmentRaycastManagerを使用して、コントローラーから現実環境を模した壁や床などにRayを飛ばし、ヒットした位置にPrefabを配置したいと考えています。
しかし、EnvironmentRaycastManager.Raycast()が常にfalseを返し、EnvironmentRaycastHit.statusも常にNoHitになります。
確認できていること
EnvironmentRaycastManager.IsSupportedはtrueになっています。
また、コントローラー自体のトラッキングは正常に動作しており、例えば以下のような値を取得できます。
text
1Position: (0.30, 1.40, 0.50) 2Forward: (0.00, 0.00, 1.00)
そのため、コントローラーのTransform自体が取得できていないわけではないと考えています。
また、原因がRayの方向だけなのかを確認するため、
- 前
- 後
- 左
- 右
- 上
- 下
の6方向にもRayを飛ばして確認しましたが、**すべてNoHit**でした。
コントローラーのforwardをそのまま使用した場合もNoHitになります。
現在の問題
以下の状態になっています。
text
1EnvironmentRaycastManager.IsSupported 2 ↓ 3true 4 5Raycast() 6 ↓ 7false 8 9EnvironmentRaycastHit.status 10 ↓ 11NoHit
XR SimulatorのSynthetic Environmentには壁や床などの環境が存在しているため、Environment Raycastでそれらを検出できることを期待しています。
しかし、どの方向にRayを飛ばしてもヒットしません。
質問
特に以下について知りたいです。
- MRUK 207.0.0 + XR SimulatorでEnvironmentRaycastManagerは正常に使用できるのでしょうか?
- Synthetic Environment側で、Environment Raycast用のDepthデータを有効にするための追加設定が必要でしょうか?
- XR SimulatorのMeta Quest 3 Device Profileに追加設定が必要でしょうか?
- MRUK 207.0.0では、
EnvironmentDepthManagerを手動で追加・設定する必要があるのでしょうか? - XR SimulatorからDepthデータが実際に供給されているか確認する方法はありますか?
EnvironmentRaycastManager+ XR Simulator + Synthetic Environmentの組み合わせで、既知の制限や注意点はありますか?- この構成でEnvironment Raycastが動作する最小構成やサンプルがあれば教えていただきたいです。
Rayの方向やTransform自体は正常そうなので、現在はXR SimulatorからDepthデータがEnvironmentRaycastManagerまで正常に渡っているのかを疑っています。
よろしくお願いいたします。
現在のスクリプト
csharp
1using Meta.XR.MRUtilityKit; 2using UnityEngine; 3 4public class InstantPlacementController : MonoBehaviour 5{ 6 public Transform rightControllerAnchor; 7 public GameObject prefabToPlace; 8 public EnvironmentRaycastManager raycastManager; 9 10 private void Update() 11 { 12 if (OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger)) 13 { 14 var ray = new Ray( 15 rightControllerAnchor.position, 16 rightControllerAnchor.forward 17 ); 18 19 TryPlace(ray); 20 } 21 } 22 23 private void TryPlace(Ray ray) 24 { 25 if (raycastManager.Raycast(ray, out var hit)) 26 { 27 var objectToPlace = Instantiate(prefabToPlace); 28 objectToPlace.transform.SetPositionAndRotation( 29 hit.point, 30 Quaternion.LookRotation(hit.normal, Vector3.up) 31 ); 32 33 if (MRUK.Instance?.IsWorldLockActive != true) 34 { 35 objectToPlace.AddComponent<OVRSpatialAnchor>(); 36 } 37 } 38 } 39}
MetaのEnvironment Raycastingのドキュメントを参考に実装しています。
試したこと
ここに問題に対して試したことを記載してください。
開発環境
- Unity:Unity 6.1
- 対象HMD:Meta Quest 3
- 実行環境:Meta XR Simulator
- Synthetic Environment:XR Simulation Environments 2.1.1
- Meta XR MR Utility Kit:207.0.0
- Meta XR SDK All:207.0.0
- Meta OpenXR:2.5.0
- OpenXR Plugin:1.16.1
- XR Plugin Management:4.5.4
- XR Interaction Toolkit:3.4.1
- AR Foundation:6.1.1
- Input System:1.18.0
- Universal Render Pipeline:17.1.0
XR SimulatorではMeta Quest 3のDevice Profileを使用しています。
Hierarchy
現在のHierarchyは以下のようになっています。
text
1New Scene 2├── Directional Light 3├── [Building Block] Camera Rig 4├── [Building Block] Passthrough 5├── [Building Block] Environment Raycast Manager 6└── Controller
Controllerには必要なスクリプトや参照を設定しています。
InstantPlacementControllerrightControllerAnchorEnvironmentRaycastManager- 配置するPrefab
あなたの回答
tips
プレビュー