0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-11

まず、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

解決方法は現在執筆中…

【いったんの追記】

点滅するような見た目の解決策として、いったん

Update Interval の直上の Auto Update のチェックを外しておくとよさそうです

Updateを明示的にスクリプトから読み込むか、表示するときの最初一回だけでもかなり精度いい気がします。

また、Holo2は過去に取得した情報を保持しているっぽいので、結構使っている空間であればUpdateなくても違う部屋の情報なんかもすでにあったりします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?