夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLensのSpatialMeshをアプリケーション内で切り替える

本日は昨日に引き続きHoloLensの表現枠です。

HoloLensではSpatialAwareness(空間認識)によって周囲の環境を認識し、現実の壁や床に対してSpatialMeshを貼ります。

f:id:Holomoto-Sumire:20201209102310j:plain

このMeshの生成間隔や、MeshにアタッチされるマテリアルなどはMRTKのSpatialAwarenessの構成で設定できます。

redhologerbera.hatenablog.com

スクリプトでアプリ実行中にSpatialMeshの設定を変える。

スクリプトで動的にSpatialAwarenessの設定を変更するためにはSpatialAwarenessの構成のオブザーバーにアクセスする必要があります。

// Use CoreServices to quickly get access to the IMixedRealitySpatialAwarenessSystem
var spatialAwarenessService = CoreServices.SpatialAwarenessSystem;

// Cast to the IMixedRealityDataProviderAccess to get access to the data providers
var dataProviderAccess = spatialAwarenessService as IMixedRealityDataProviderAccess;

var meshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

microsoft.github.io

では今回はこれを使用してSpatialMeshを削除してみます。

〇アプリ実行中にSpatialMeshを削除する

HoloLensのデジタル情報と物理情報のMixedRealityはSpatialMeshが大きな働きを担っています。

しかし時にはSpatialMeshを必要としない場合もあります。 アプリケーション内で終始SpatialMeshを必要としない場合はUnity側でMRTKの設定から最初から設定を行えばよいのですが、アプリの中でSpatialMeshが不要になるときもあります。

その例として、床など現実の情報に対してオブジェクトを配置しその後物理判定を行うような場合が考えられます。

次のようなコードを書きました。

using UnityEngine;

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.SpatialAwareness;
public class Test : MonoBehaviour
{
    
    
    public void ChangeSpatialMesh()
    {
        var access = CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;
        var observer = access.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(); 
        // Change the VisivleMaterial to new material.
        observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
           
           
        //dalete SpatialMeshCollider
        Destroy(GameObject.Find("Spatial Awareness System"));
        observer.Suspend();
    }
}

実行すると次のようになります。

これはまずMRTKで提供されている[SpatialAwarenessSystem]のオブザーバーにアクセスします。

    var access = CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;
            var observer = access.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(); 

このObserverは前回の記事で紹介したSpatialMeshの設定に相当します。この中から[DisplayOption]のタイプをNone(なし)に切り替えます。

   observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;

これによってSpatialMeshが生成されなくなります。

しかしこの時点ではすでに生成されたSpatialMeshが残り続けてしまいます。

このSpatialMeshをDestroyで削除します。

         Destroy(GameObject.Find("Spatial Awareness System"));
            observer.Suspend();

最後にObservertを一時停止させています。

ここで指定している[Spatial Awareness System]オブジェクトはUnityのhierarchy上でカメラやHand関連などが格納される[MixedReality Playspace]オブジェクトに格納され、SpatialMeshが格納される親オブジェクトになります。

f:id:Holomoto-Sumire:20210213214252j:plain

これを実行すると次のようになります。

youtu.be

以上でアプリケーション内で動的にSpatialMeshを削除できました。