夜風のMixedReality

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

SceneUnderstandingを学ぶ NavMesh-Simple シーン 機能編 その②

本日はツールの調査枠です。

SceneUnderstandingに関して学びます。

〇SceneUnderstandingとは?

SceneUnderstandingはMicrosoftによって提供されているMRTKの拡張ツールで、HoloLensによって取得する空間認識機能を拡張します。

次のGitリポジトリで公開されています。

github.com

旧MixedRealityToolkit(HoloToolkit)では[SpatialUnderstanding]と呼ばれる機能が提供されており、MRTKに同梱されていましたが、MRTKv2移行は2.51現在は別の機能として提供されています。

〇Spatial Mapping(SpatialAwareness)との違い

HoloLensの特徴として[SpatialAwareness(空間認識)]機能があります。

[SceneUnderstanging]も[Spatialmapping]もどちらもHoloLensデバイス自体のセンサーにアクセスしてAPI経由で情報を受けとりますが、二つには次のような違いがあります。

・[SpatialMapping]には検知エリアに制限がありますが、[SceneUnderstanding]には制限がありません。無制限で検出を行えます。

・SpatialMappingに比べ[SceneUnderstanding]は壁や床、オブジェクトを解析することができます。

f:id:Holomoto-Sumire:20201223215028p:plain

前回まででNabMesh-Simpleシーンの機能の解析を行っています。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

●Scene Objects Quad

[2]キーを押すことでメッシュがQuadに変わります。

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

これは[SampleInputManager]の169行目の処理が走ります。

 inputActions.Add(InputAction.Create("Scene Objects Quad", KeyCode.Alpha2, "Quad Mode", async () =>
            {
                SuManager.SceneObjectRequestMode = RenderMode.Quad;
                await SuManager.DisplayDataAsync();
            }));

ここでは[SceneUnderstandingManager]の[RenderMode]をQuadに変えます。

この[RenderMode]はQuadのほかにQuadWithMask(形状をQuadにしたうえでマスク)、Mesh(通常)、Wireframe(ワイヤフレーム)が用意されています。

    public enum RenderMode
    {
        Quad,
        QuadWithMask,
        Mesh,
        Wireframe
    }

[3]キーを押すことによって逆にレンダリングモードをメッシュに変更します。

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

            inputActions.Add(InputAction.Create("Scene Objects Mesh", KeyCode.Alpha3, "Mesh Mode", async () =>
            {
                SuManager.SceneObjectRequestMode = RenderMode.Mesh;
                await SuManager.DisplayDataAsync();
            }));

[4]キーを押すことで今度はワイヤフレームに変更します。

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

            inputActions.Add(InputAction.Create("Scene Objects Wireframe", KeyCode.Alpha4, "Wireframe Mode", async () =>
            {
                SuManager.SceneObjectRequestMode = RenderMode.Wireframe;
                await SuManager.DisplayDataAsync();
            }));

[5]を押すことで床と壁、天井以外をマスクすることができます。これは188行目付近の処理が走ります。

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

 inputActions.Add(InputAction.Create("Toggle Platforms", KeyCode.Alpha5, "Enable / Disable large horizontal surfaces", async () =>
            {
                SuManager.RenderPlatformSceneObjects = !SuManager.RenderPlatformSceneObjects;
                await SuManager.DisplayDataAsync();
            }));

[SceneUnderstandingManager.RenderPlatformSceneObjects]は個別のタイプのレンダリングを行う(マスクを行う)メソッドです。

``` SceneUnderstanding.SceneObjectKind kind = suObject.Kind; switch (kind) { case SceneUnderstanding.SceneObjectKind.World: if (!RenderWorldMesh) return false; break; case SceneUnderstanding.SceneObjectKind.Platform: if (!RenderPlatformSceneObjects) return false; break; case SceneUnderstanding.SceneObjectKind.Background: if (!RenderBackgroundSceneObjects) return false; break; case SceneUnderstanding.SceneObjectKind.Unknown: if (!RenderUnknownSceneObjects) return false; break; case SceneUnderstanding.SceneObjectKind.CompletelyInferred: if (!RenderCompletelyInferredSceneObjects) return false; break; }

 
Switch文ではどのオブジェクトをレンダリング対象から外すかを指定します。

[<b>6</b>]キーを入力することで[<b>Background</b>]をマスクします。

[f:id:Holomoto-Sumire:20201226232000j:plain]

inputActions.Add(InputAction.Create("Toggle Background", KeyCode.Alpha6, "Enable / Disable background objects", async () => { SuManager.RenderBackgroundSceneObjects = !SuManager.RenderBackgroundSceneObjects; await SuManager.DisplayDataAsync(); }));

これも[<b>5</b>]キー同様の処理でレンダリングするオブジェクトを設定します。


[<b>7</b>]キーは[<b>Unknown</b>]をレンダリング対象から外します。

inputActions.Add(InputAction.Create("Toggle Unknown", KeyCode.Alpha7, "Enable / Disable unknown objects", async () => { SuManager.RenderUnknownSceneObjects = !SuManager.RenderUnknownSceneObjects; await SuManager.DisplayDataAsync(); }));

こちらも同様の処理でレンダリング対象を外しています。


本日は以上です。

SceneUnderstandingはMRTKに比べドキュメントやスクリプティングレファレンスがしっかりしているわけではないので少しずつ解析していきます。