目次
はじめに
こんにちは。HoloLensチームの野元です。
本記事では、MRTK3で空間認識を行い、空間メッシュのデータをハンドリングする方法について調査・検証した結果を紹介します。
調査
MRTKv2とMRTK3ではどのような違いがあるのか調査した結果が次の通りです。
MRTKv2
Microsoft.MixedReality.Toolkit.SpatialAwareness.IMixedRealitySpatialAwarenessObservationHandlerを実装すれば、空間のメッシュデータをハンドリングできます。
詳しいやり方については、こちらの過去記事で説明していますので、興味のある方はご覧ください。
MRTK3
- 記事執筆時点では、空間メッシュ視覚エフェクトの項目で少し触れられている程度なので詳細は不明ですが、
Packages\MRTK Environment Early Preview\Visualizers\SpatialMesh
配下に関連するクラスがあります。
- MS公式のMRTK3のUnityサンプルプロジェクトのSpatialMappingExampleシーンでは、ARMeshManagerによる空間の可視化が行われてます。
- MRTK3とAR FoundationともにXRMeshSubsystemが使用されているため、
XRMeshSubsystem.Start()
で空間認識を開始したり、XRMeshSubsystem.Stop()
で空間認識の停止したりできそうです。
検証
検証環境
- Windows 11
- Unity 2021.3.7f1
- MRTK3 pre.9
空間メッシュのビジュアライズ
- UnityにMRTK3を導入します。
- MRTK3 の初期セットアップをご参照ください
MRTK XR Rig
のGameObject配下に任意の名前(今回はARMeshManager
と命名)で空のGameObjectを生成し、ARMeshManager
をAdd Componentします。- 任意の名前(今回は
SpatialMesh
と命名)で空のGameObjectを生成し、Mesh Filter
・Mesh Renderer
・Mesh Collider
をAdd Componentし、Mesh Renderer
のMaterials
にマテリアルをアタッチしたあとプレファブ化します。 ARMeshManager
のMesh Prefab
にプレファブ化したGameObjectをアタッチします。- アプリケーションをビルド・デプロイし、HoloLens 2で確認すると空間メッシュのビジュアライズができていることが確認できます。
空間メッシュデータのハンドリング
- MRTK3を使ったパターン
Microsoft.MixedReality.Toolkit.Environment.BaseSpatialMeshVisualizer
ではメッシュの変更を検知するイベントが定義されていないため、メッシュデータのハンドリングは現時点では厳しそうです。
- AR Foundationを使ったパターン
- UnityEngine.XR.ARFoundation.ARManager.meshesChangedイベントを使えばメッシュデータをハンドリングできそうですが、MRTK3の枠をはみ出すため今回は検証見送りとします。
まとめ
※記事執筆時点での情報になります
- MRTK3では空間メッシュデータのハンドリングにはまだ対応していません。
Microsoft.MixedReality.Toolkit.Environment.GenericSpatialMeshVisualizer
を使えばメッシュの可視化ができると思われますが、Microsoft.MixedReality.Toolkit.Environment.GenericSpatialMeshVisualizerConfig
のScriptableObjectが有効化されていないため使用できません- また、
Microsoft.MixedReality.Toolkit.Environment.GenericSpatialMeshVisualizer.Meshes
からメッシュデータへのアクセスは可能ですが、メッシュの状態が変更されたこと(追加・更新・削除)を通知するイベントが定義されていないため、これを使ってメッシュデータのハンドリングをすることは現実的ではなさそうです。
- AR FoundationのARManagerを使用することで空間メッシュデータのハンドリングができます。(もしかしたら今後は空間メッシュデータのハンドリングはAR Foundationに委譲されるのかもしれません)
- InspectorからARManagerコンポーネントの
Mesh Prefab
にメッシュ可視化向けのGameObjectをアタッチすれば、空間メッシュの可視化ができます。 UnityEngine.XR.ARFoundation.ARManager.meshesChanged
イベントを使えばメッシュデータの状態変更(追加・更新・削除)を検知することができるため、空間メッシュデータのハンドリングができます。
- InspectorからARManagerコンポーネントの