MRが楽しい

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

MRTKでHoloLens2の空間メッシュの詳細レベルや範囲を動的に切り替える その2

本日はMRTKの小ネタ枠です。
MRTKで空間メッシュの詳細レベルや範囲を動的に切り替える方法を記事にします。
今回はメッシュの範囲を切り替える方法です。

SpatialAwarenessの設定

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

空間メッシュの観測範囲に関連する設定項目は以下の3つです。

Is Stationary Observer

観測点を固定するかユーザーと一緒に移動するかを切り替えます。
trueの場合、[Observation Extents]で定義されたボリュームを持つ観測点は起動時の原点に残り続けます。
falseの場合、観測点はユーザーの頭に追従します。

Observer Shape

空間メッシュを観測するときに使用するボリュームのタイプを定義します。
サポートされているオプションは次のとおりです。

タイプ 詳細
Axis Aligned Cube アプリ起動時のワールド座標系の軸に整列した矩形形状
User Aligned Cube ユーザーのローカル座標系に合わせて回転する矩形形状
Sphere ワールド空間の原点を中心とする球状。[Observation Extents]のX値が球の半径になります

Observation Extents

空間メッシュが観測される観測点からの距離を定義します。

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

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

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

サンプルスクリプト

SpatialAwarenessの観測範囲を切り替える関数を持った以下のスクリプトを作成しました。
・SpatialAwarenessRangeSwitch.cs

using UnityEngine;

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

public class SpatialAwarenessRangeSwitch : MonoBehaviour
{
    public void SwitchSmall()
    {
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // 0.5m x 0.5m x 0.5m の範囲を観察する
        openXRSpatialAwarenessMeshObserver.ObservationExtents = new Vector3(0.5f, 0.5f, 0.5f);
    }
    public void SwitchMiddle()
    {
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // 1m x 1m x 1m の範囲を観察する
        openXRSpatialAwarenessMeshObserver.ObservationExtents = new Vector3(1, 1, 1);
    }
    
    public void SwitchLarge()
    {
        // 利用可能なOpenXRメッシュオブザーバーを取得する
        var openXRSpatialAwarenessMeshObserver =
            CoreServices.GetSpatialAwarenessSystemDataProvider<OpenXRSpatialAwarenessMeshObserver>();

        // 3m x 3m x 3m の範囲を観察する
        openXRSpatialAwarenessMeshObserver.ObservationExtents = new Vector3(3, 3, 3);
    }
}

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


HoloLens2上での動作確認

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

3m x 3m x 3m(Large)


0.5m x 0.5m x 0.5m(Small)