ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

HoloLensの Special Mapping データ(点群)を取り出す

HoloLensの Special Mapping データ(点群)を取り出してみます。

まだメッシュがうまく取り出せていないので要調査取れたかな?

f:id:kaorun55:20160601144838p:plain

f:id:kaorun55:20160601114142p:plain

2016/06/01のHoloLensのWindows 10の更新でDevice PortalにFile Explorerが追加されたので、HoloLens内のストレージ(ドキュメント、カメラロール、アプリケーション)に保存したファイルを取り出せるようになりました(書き込みもできます)。

今回はHoloLens内で点群を取得し、OBJファイルに出力して取り出すところまでです。

サンプルプロジェクトはこちらです。

github.com

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のようにダウンロードできます。

f:id:kaorun55:20160601120211p:plain