HoloLens 2が持っている空間情報をアプリ内で表示する

はじめに

HoloLens 2はセンサーなどを用いて周辺環境をスキャンしており、今いる空間の情報を持っています。
今回は「HoloLens 2が認識している空間情報を3Dオブジェクトとして表示する」というアプリを作ってみたいと思います。

環境

Unity 2020.3.11f1
MRTK 2.7.2
OpenXR Plugin 2.1.8

実装のポイント

空間メッシュの取得

HoloLens 2が持っている空間メッシュは以下のようにして取得することができます。

var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

詳細は以下のドキュメントをご覧ください。 docs.microsoft.com

空間メッシュを組み合わせる

取得した空間メッシュは複数になるため、組み合わせる必要があります。 以下のように組み合わせるための配列を作り、取得したメッシュを割り当てていきます。

CombineInstance[] combine = new CombineInstance[observer.Meshes.Count];

var i = 0;
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
     combine[i].mesh = meshObject.Filter.sharedMesh;
     combine[i].transform = meshObject.Filter.transform.localToWorldMatrix;
     i++;
}

あとはMeshFilterを用いるとHoloLens 2で表示することができます。

実装手順

まず以下のようなスクリプトを作成します。

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

public class ShowSpatialMeshScript : MonoBehaviour
{
    private void ShowSpatialMesh()
    {
        //空間メッシュの取得
        var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

        //複数のメッシュを組み合わせる
        CombineInstance[] combine = new CombineInstance[observer.Meshes.Count];

        var i = 0;
        foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
        {
            combine[i].mesh = meshObject.Filter.sharedMesh;
            combine[i].transform = meshObject.Filter.transform.localToWorldMatrix;

            i++;
        }

        //MeshFilterコンポーネントの取得
        var meshFilter = GetComponent<MeshFilter>();

        //MeshFilterにメッシュを設定
        meshFilter.mesh.CombineMeshes(combine);
    }

    void Start()
    {
        //アプリ起動時から1秒ごとに「ShowSpatialMesh」を実行
        InvokeRepeating("ShowSpatialMesh", 0, 1);
    }
}

次にUnityエディタで以下の通り設定を行います。
① Hierarchyで右クリックから「Create Empty」で空のオブジェクトを作成します(画像では「SpatialMeshObject」という名前にしています)
② 画像のようにTransformの値を設定します
③ このオブジェクトに「Mesh Filter」「Mesh Renderer」「ShowSpatialMeshScript(上で作成したスクリプト)」の3つのコンポーネントを追加します。また、Mesh RendererのMaterialsのElement0には「Default-Material」を選択します

f:id:jbs_tafurukawa:20220303180524p:plain

HoloLens 2で実行

以下の動画のように空間の情報をアプリケーション内で表示することができます。

参考にしたサイト

【Unity】スクリプトからメッシュを作ってみる! – 株式会社ライトコード (rightcode.co.jp)
Mesh-CombineMeshes - Unity スクリプトリファレンス (unity3d.com)

投稿者プロフィール
古川 貴浩

古川 貴浩

HoloLens 2アプリケーションの開発をしています。

執筆記事一覧