HoloLensの Special Mapping データ(点群)を取り出してみます。
まだメッシュがうまく取り出せていないので要調査取れたかな?
2016/06/01のHoloLensのWindows 10の更新でDevice PortalにFile Explorerが追加されたので、HoloLens内のストレージ(ドキュメント、カメラロール、アプリケーション)に保存したファイルを取り出せるようになりました(書き込みもできます)。
今回はHoloLens内で点群を取得し、OBJファイルに出力して取り出すところまでです。
サンプルプロジェクトはこちらです。
Unity使用時のHoloLensのメッシュデータ
Unityでアプリを開発するときは、MeshFilterが動的に生成され、そのメッシュを取り出すことになります。
メッシュの生成については、下記どちらかを参照してください。
101のほうは実機(またはエミュレーター)での動作となりますが、プロジェクト全体が小さく見通しが良いです。
230のほうはUnityエディターでも動作します(デバイスポータルからダウンロードしたモデルに切り替わるつくりになっている)がプロジェクト全体が大きいです。
順番に両方見るのがいいですが、好きなようにどうぞ。
メッシュの生成はSurfaceObserverクラスが行います。これをプロジェクト内で探しましょう。メッシュはSurfaceObserver.Update()に与えられたハンドラにコールバックされますので、それを探します。
その中でGameObjectを生成し、MeshFilterを追加しているコードがあります。101の場合はこのMeshFilterをリストに保存するコードを追加しておきます。
メッシュデータの取り出し
メッシュデータはそれぞれのMeshFilterのsharedMeshに入っていますので、その中のverticesおよびtrianglesを取り出します。なお、座標はローカル座標系になっているので、ワールド座標系に変換します。変換にはtransform.TransformPoint()またはtransform.localToWorldMatrixの行列を使用します。
次のコードでは、すべてのメッシュデータから最大値、最小値を取得しています。
gist85e395ec823dc3d2bd827ed7762e8ff0
メッシュデータの保存
次にメッシュデータを保存します。
先ほどと同じ要領で頂点および面情報をOBJ形式で書き出します。
OBJ形式のフォーマットはこちらがわかりやすいです。
Meshごとにオブジェクトグループを作成し、頂点および面のインデックスを書き込みます。面のインデックスは1から始まり、頂点の連番になっています。
なお、書き込みはUWP出力時のみ行うので、コード部分を#if で囲んでいます。
#if !UNITY_EDITOR
#endif
この中はUWP(C# 6.0)なので、async/awaitなども使えるようになります。
ここではCameraRollに保存しています。ドキュメントフォルダはマニフェストで設定したのですが、アクセスエラーになりました(企業アカウントでビルドしないとダメなようです)。
gist32b65837f82069d17be0f5cd01bae98e
メッシュデータの取り出し
HoloLensのWindows 10 14342でFile Explorerが追加されました。
Device PortalでCameraRollにアクセスすると、書き込んだOBJファイルがあります。これはMixed Reality Captureのようにダウンロードできます。