👻

【HoloLens2 MRTK】SceneUnderstandingで設定したオブジェクト作られる際のイベント取得

2022/05/03に公開

まず、MRTKのSceneUnderstaindingとは…

そのSceneUnderstandingでは検出の更新頻度や生成するオブジェクトを設定できます

Image from Gyazo

画像では壁のみ、5秒間隔で更新し、オブジェクトを生成させるような設定をしています

環境

  • Unity v2019.4.18
  • MRTK v2.7.2
  • SceneUnderstanding v0.6.0

オブジェクト追加イベント取得するコード

using Microsoft.MixedReality.Toolkit.Examples.Demos;
using Microsoft.MixedReality.Toolkit.Experimental.SpatialAwareness;
using Microsoft.MixedReality.Toolkit.SpatialAwareness;
using UnityEngine;

public class SceneUnderstandingController : DemoSpatialMeshHandler, IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessSceneObject>
{
    protected override void Start()
    {
    }

     protected override void OnEnable()
    {
        RegisterEventHandlers<IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessSceneObject>, SpatialAwarenessSceneObject>();
    }

    protected override void OnDisable()
    {
        UnregisterEventHandlers<IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessSceneObject>, SpatialAwarenessSceneObject>();
    }

    protected override void OnDestroy()
    {
        UnregisterEventHandlers<IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessSceneObject>, SpatialAwarenessSceneObject>();
    }

    public void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessSceneObject> eventData)
    {
        Debug.Log("added!!");
        Debug.Log(eventData);
    }

    public void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessSceneObject> eventData)
    {
    }

    public void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessSceneObject> eventData)
    {
        Debug.Log("removed!!");
        Debug.Log(eventData);
    }

}

DemoSpatialMeshHandler はMRTKのExampleを入れて、PackageManagerからSpatialAwarenessを追加したら使えた

Image from Gyazo

一応コードも張っておきます

DemoSpatialMeshHandler
#region アセンブリ Microsoft.MixedReality.Toolkit.Examples, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// C:\Users\Honeycomb-lab\Documents\ono\LIXIL_holo2\LIXLI_holo2\Library\ScriptAssemblies\Microsoft.MixedReality.Toolkit.Examples.dll
#endregion

using Microsoft.MixedReality.Toolkit.SpatialAwareness;
using UnityEngine;
using UnityEngine.EventSystems;

namespace Microsoft.MixedReality.Toolkit.Examples.Demos
{
    [AddComponentMenu("Scripts/MRTK/Examples/DemoSpatialMeshHandler")]
    public class DemoSpatialMeshHandler : MonoBehaviour, IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>, IEventSystemHandler
    {
        protected bool isRegistered;

        public DemoSpatialMeshHandler();

        public virtual void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData);
        public virtual void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData);
        public virtual void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData);
        protected void AddToData(int eventDataId);
        protected virtual void OnDestroy();
        protected virtual void OnDisable();
        protected virtual void OnEnable();
        protected virtual void RegisterEventHandlers<T, U>()
            where T : IMixedRealitySpatialAwarenessObservationHandler<U>
            where U : BaseSpatialAwarenessObject;
        protected void RemoveFromData(int eventDataId);
        protected virtual void Start();
        protected virtual void UnregisterEventHandlers<T, U>()
            where T : IMixedRealitySpatialAwarenessObservationHandler<U>
            where U : BaseSpatialAwarenessObject;
        protected void UpdateData(int eventDataId);
    }
}

これで見てみると5秒間隔で OnObservationRemoved が検出した壁や床の数分だけ実行されて、直後に OnObservationAdded が実行される感じ

なので、実は壁や床のオブジェクトが点滅するような見た目になっちゃっています

Image from Gyazo

解決方法は現在執筆中…

Discussion