HoloLens MixedRealityToolkit-Unity SavingSpatialMeshes

こんにちは、ナレコム前川です!

今回は、MixedRealityToolkit の SavingSpatialMeshes をご紹介します。

MixedRealityToolkit の導入方法について コチラ で説明しているので、導入をしていない方は参照してください。

SavingSpatialMeshes

SavingSpatialMeshes では、SpatialMapping もしくは SpatialUnderstanding により得られる空間メッシュを保存します。

MRToolkit では、2つのシーンが例として出されているので一つずつ紹介していきます。
シーンは以下です。

  • SaveSpatialMapping
  • SaveSpatialUnderstanding

この2つのシーンは、異なる空間メッシュを使用している以外は、同じようにセットアップされています。

それでは、進めていきましょう。

SaveSpatialMapping

まず、[Project] パネルから [HoloToolkit-Example] -> [SavingSpatialMeshes] -> [Scenes] の順に選択し、
[SaveSpatialMapping] をクリックしてください。

[Hierarchy] パネルから [HoloLensCamera] オブジェクトを展開、選択してください。

このオブジェクトは、[HoloToolkit] -> [Input] -> [Prefabs] 内にあります。
HoloLens のカメラを管理しています。

次に、[Hierarchy] パネルから [Scene] オブジェクトを展開、選択してください。
この [Scene] オブジェクトは、[HoloToolkit-Example] -> [SavingSpatialMeshes]
の中のプレハブを持ってきています。

[Inspector] パネル内に [Keyword Manager] スクリプトがあることを確認してください。
このスクリプトでは、ユーザーが発話することでイベントが発生するように設定しています。
ここでは、「Capture Mesh」 と発話すると、空間メッシュ(SpatialMappingMesh) を保存し、
”Captured Mesh”と表示するように設定しています。
また、「Load Next Scene」 と発話すると、新しく読み込み始めます。

[Scene] オブジェクトの子要素 [Debug Text] では、
シーン実行時にデバッグ情報の表示を行っています。

続いて、[Hierarchy] パネルから [SpatialMapping] オブジェクトを選択してください。
このオブジェクトは、[HoloToolkit] -> [SpatialMapping] -> [Prefab] 内から持ってきています。

[SpatialMapping] オブジェクトは、空間メッシュの生成、可視化、
デバイスポータルにデータの保存や読み込みを行う空間マッピングの基本的なプレハブです。

[Inspector] パネル内のスクリプトとそれぞれの大まかなパラメータについて説明していきます。
① [Spatial Mapping Observer]
HoloLens で実行されている SurfaceObserver によって検出された
すべての空間マッピングデータを追加および更新します。

・Triangles Per Cubic Meter … 立方メートル毎に計算するためのメッシュで表示される三角形の数を指定できます。
・Time Between Update … 空間マッピングのアップデートの待ち時間の指定ができます。
・Observer Volume Type … 検知を行う形式を選択できます。

②[Spatial Mapping Manager]
SurfaceObserver や メッシュを使用することを許可して、管理を行います。
メッシュの表示や SurfaceObserver を自動的に起動するかなどを設定できます。

・Physics Layer … 空間マッピングのレイヤー数の指定ができます。
・Surface Material … 空間マッピングのレンダリングに使われるマテリアルを選択できます。
・Auto Start Observer … Surface Observer を自動的に始動します。
・Draw Visual Meshes … 空間マッピングのメッシュの表示・非表示の設定ができます。
・Cast Shadow … 空間マッピングデータに影を割り当てるかを設定できます。

③[File Surface Observer]
空間マッピングのメッシュを指定されたファイルから読み込んだり、保存したりします。
ここでは、キーボードで L を叩くと保存されたメッシュデータのファイルが読み込むよう設定しています。

上記3つのスクリプトは、[HoloToolkit] -> [Spatial Mapping] -> [Scripts] 内にあります。

それでは、いつも通り配置とビルドを行います。
配置とビルドに関しては、HOLOLENS 5つのビルド方法を参照してください。

実行してみると、視線の先に [Scanning | Spatial Mapping] という文字が表示され、
空間をスキャンします。スキャンされた空間は、白いワイヤーで表示されます。
「Capture Mesh」 と発話すると、[Captured Mesh] と文字が表示され、空間メッシュが保存されます。
また、「Load Next Scene」 と発話すると、再度[Scanning | Spatial Mapping] という文字が表示され、
空間をスキャンし始めます。

実行動画はコチラです。

キャプチャーしたメッシュをローカルにダウンロード・確認する手順は以下のとおりです。
①デバイスポータルに接続し、[File Explorer] をクリック。
② [LocalAppData] -> [自身のプロジェクト名] -> [RomingState] の順に選択。

③メッシュデータが保存されていることを確認。

④ Unity に戻り、[Spatial Mapping] を選択し、[Inspector] パネルから [FileSurfaceObserver] を確認。
⑤ [Open File Location] をクリックし、開いた場所に先ほどのメッシュデータをダウンロード。

⑥ Unity で再生ボタンをクリックして、キーボードで ” L ” をクリック。
⑥メッシュデータの読み込み完了。

SaveSpatialUnderstanding

まず、[Project] パネルから [HoloToolkit-Example] -> [SavingSpatialMeshes] -> [Scenes] の順に選択し、
[SaveSpatialUnderstanding] をクリックしてください。

次に、[Hierarchy] パネルから [SpatialUnderstanding] を選択してください。

このオブジェクトは、[HoloToolkit] -> [SpatialUnderstanding] -> [Prefabs] から持ってきてあります。
[Inspector] パネルで3つのスクリプトがあるのを確認してください。
それぞれ説明していきます。

① [Spatial Understanding] スクリプトは、空間スキャンのプロセスの状態や流れを管理します。

② [SpatialUnderstandingSourceMesh] スクリプトは、入力されるメッシュを
Spatial Understanding の dll に提供します。
また、コンポーネントは Spatial Mapping のモジュールに依存しており、
Spatial Mapping の SurfaceObject リストからアップデートされた dll 形式のメッシュリストを保持します。

③ [SpatialUnderstandingCustomMesh] スクリプトは、
Spatial Understanding の dll によって生成されたカスタムメッシュを管理します。
カスタムメッシュは、スキャン中に生成され、スキャンが終了する際に再度生成されるメッシュです。
このメッシュは、スキャンの状態を可視化することができます。

上記の3つのスクリプトは、[Project] パネルの [HoloToolkit] -> [SpatialUnderstanding] -> [Scripts]内にあります。

それでは、いつも通り配置とビルドを行います。
配置とビルドに関しては、HOLOLENS 5つのビルド方法を参照してください。

実行してみると、緑のメッシュでスキャンしていることが確認できます。
スキャンに使用されるメッシュ以外は同じなので、[Spatial Mapping] と同様に操作を行ってみてください。
ここでは、[Spatial Mapping] で得たメッシュを均等になるように整えて、床や壁などを認識しています。

実行動画はコチラです。

[SaveSpatialMapping] 同様の手順でメッシュデータをローカルに保存して、Unity 上で確認してください。

Spatial Understanding のメッシュは、以下のように表示されました。

以上です。お疲れ様でした。

この記事を書いた人

azure-recipe-user