夜風のMixedReality

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

HoloLens のSpatialMeshをカスタマイズする HoloLens アドベントカレンダー2020 9日目

本日はMRTK調査枠です。 またこの記事はHoloLensアドベントカレンダー2020 9日目の記事です。

〇SpatialMeshとは?

本日はSpatialMeshを細かく取得していきます。

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

SpatialMeshはHoloLensの主要な機能の一つである[SpatialAwareness](空間認識)機能によって生成されるメッシュです。

HoloLensアプリでは現実の壁や床に対して貼られるこのメッシュを利用することで、現実とデジタル情報の対話、MixedRealityを実現します。

HoloLensアドベントカレンダー2020 2日目の記事では実際にHoloLensで取得できるSpatialMeshに関しての調査を行いました。

redhologerbera.hatenablog.com

〇SpatialMeshの表示

SpatilaMeshを表示するためにはUnityでMRTKの構成を使用して行います。

UnityでMRTKを導入したシーンから説明します。

〇環境

・Unity2019.3.9f1

・MRTK v2.5

①hierarchyウィンドウ内の[MixedRealityToolkit]オブジェクトを選択してinspectorウィンドウを開きます。

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

②inspectorウィンドウから[MixedRealityToolkitProfile]を自身の環境に合わせて選択し、横にある[Clone]を押します。

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

HoloLens1stをターゲットとする場合は[DefaultHoloLens1ConfigurationProfile]、HoloLens2をターゲットとする場合[DefaultHoloLens2ConfigurationProfile]を選択しcloneします。

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

Profileはターゲットや環境に合わせた機能の設定を行うことができます。MRTKでは初期で用意されているProfile自体は変更することができず(ロックされている)、複製することでオリジナルにカスタマイズを行うことができます。

③サイドタブから[SpatialAwareness]を選択します。

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

ここでは[SpatialAwareness]の機能に関する設定を行います。[Enable SpatialAwareness System]がオフになっている場合[SpatialAwareness]の機能をアプリ内で使用しない設定になります。(この場合でもHoloLens自体は自己位置推定にSpatialAwarenessを使用しています。アプリ内ではその情報がいきわたりません)

④[Enable SpatialAwareness System]をオン(有効)にします。

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

これでSpatialAwarenessが有効になりアプリ内でSpatialMeshが貼られるようになります。

⑤SpatialAwarenessのprofileをクローンします。

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

こちらも①②同様クローンすることによってカスタマイズできるようになります。

MRTKの構成は主に子の形になっています。

〇SpatialMeshの見た目を変える

デフォルトの状態ではSpatialMeshがワイヤフレームとして表示されるように設定されています。

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

これはSpatialAwarenessの設定の最下部に表示されている[DisplaySettings]で変更できます。

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

[DisplayOption]では[None(SpatialMeshを生成しない)]、[Visible]、[Occlusion]のプルダウンが用意されています。

[Visible]、[Occlusion]の場合それぞれ[Visible Material]、[Occlusion Material]に設定されているMaterialが使用されています。

f:id:Holomoto-Sumire:20201209101217j:plain
画像ではMRTK_WireFreamが使用されます。

[Visible]、[Occlusion]とはあるものの見えるマテリアル、見えないマテリアルを設定しなければならないというわけではなく、2つのマテリアルスロットがあるという感じでしょうか

SpatialMesh用のShaderを使用したほうが最適なパフォーマンスを発揮することができますが、専用のマテリアル以外でも動かすことができます。

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

f:id:Holomoto-Sumire:20201209101939j:plain
Toonシェーダー

〇スキャン時間を設定する

SpatialAwarenessのProfile、[Update interval]の設定によってメッシュを再生成する時間を設定できます。

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

デフォルトでは3.5が設定されており、3.5秒おきにメッシュの再生成が行われています。

細かいほどより素早く環境を更新できますが、その分人や動物などの動くものがある環境下ではノイズが入りやすくなってしまいます。

また、スキャン間隔が荒いほど、SpatialMeshの漏れ(スキャンできていない空間)が発生しやすくなります。

[Setup Behavior]はメッシュの生成の開始に関する設定です。

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

デフォルトでは[Auto]に設定されており、自動でメッシュの生成が始まります。

[Manual Start]に設定することでスクリプトから任意のタイミングでメッシュの生成を行うことができます。

〇HoloLensアドベントカレンダー2020

冒頭でもお知らせしましたが、本日の記事はHoloLensアドベントカレンダー9日目の記事になります。

qiita.com

明日はガチ本さんによるAzure系の記事です!