MRが楽しい

MRやVRについて学習したことを書き残す

MRTKでHoloLens2の空間メッシュの表示方法や有効無効を動的に切り替える

本日はMRTKの小ネタ枠です。
MRTKで空間メッシュの表示方法や有効無効を動的に切り替える方法を記事にします。

SpatialAwarenessの設定

MRTKを利用してHoloLens2アプリを作成する場合、空間メッシュはSpatialAwarenessの設定で管理されます。
SpatialAwarenessの表示設定をスクリプトから操作するにはSpatialAwarenessMeshObserverのDisplayOptionにアクセスします。
learn.microsoft.com
learn.microsoft.com

使用しているXRプラグインによって取得すべきMeshObserverの種類が変わることに注意が必要です。

// Unity OpenXR pluginを選択している場合
var openXRSpatialAwarenessMeshObserver =
    CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

// Built-in Unity pluginsを選択している場合
var mixedRealitySpatialAwarenessMeshObserver =
    CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

サンプルプロジェクトの作成

MRTKを使った基本プロジェクトの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com

今回はデフォルトの DefaultMixedRealityToolkitConfigurationProfile で作成したプロジェクトを利用します。

サンプルスクリプト

SpatialAwarenessの表示設定を[表示(Visible)][オクルージョン(Occlusion)][非表示(None)]に切り替える関数を持った以下のスクリプトを作成しました。
・SpatialAwarenessDisplaySwitch.cs

using UnityEngine;

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.SpatialAwareness;
using Microsoft.MixedReality.Toolkit.XRSDK.OpenXR;

public class SpatialAwarenessDisplaySwitch : MonoBehaviour
{
    public void SwitchVisible()
    {
        // プラグインの選択でUnity OpenXR pluginを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // 表示(Visible)に設定する
        openXRSpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.Visible;
        
        // プラグインの選択でBuilt-in Unity pluginsを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なMixedRealityメッシュオブザーバーを取得する
        var mixedRealitySpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

        // 表示(Visible)に設定する
        mixedRealitySpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.Visible;
    }

    public void SwitchOcclusion()
    {
        // プラグインの選択でUnity OpenXR pluginを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // オクルージョン(Occlusion)に設定する
        openXRSpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;
        
        // プラグインの選択でBuilt-in Unity pluginsを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なMixedRealityメッシュオブザーバーを取得する
        var mixedRealitySpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

        // オクルージョン(Occlusion)に設定する
        mixedRealitySpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;
    }

    public void SwitchNone()
    {
        // プラグインの選択でUnity OpenXR pluginを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // 非表示(None)に設定する
        openXRSpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
        
        // プラグインの選択でBuilt-in Unity pluginsを選択している場合、以下のコードでメッシュの表示を切り替えることができる
        // 利用可能なMixedRealityメッシュオブザーバーを取得する
        var mixedRealitySpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

        // 非表示(None)に設定する
        mixedRealitySpatialAwarenessMeshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
    }
}

作成したサンプルスクリプトを適当なオブジェクトにアタッチし、シーンに配置したボタンから関数を呼び出せるようにしました。


HoloLens2上での動作確認

アプリケーションをビルドしてHoloLens2にデプロイします。
ボタン操作で空間メッシュの表示を切り替えることができれば成功です。