デプスセンサー等で取得した点群データをUnityで読み込み可視化する方法を紹介します。
今回はUnityのAsset Storeからフリーのビューアをインポートして可視化してみます。
■Unityで点群データを可視化
Unityで点群データを表示して動かしたり、カメラアングルを変更したりしてシミュレーターなどアプリケーション化することができます。
点群を表示させるには点群データから座標値、色値を読み込み3D空間に点として配置していく方法でUnity上に表示することができます。
今回は簡単に点群を表示させるため以前の記事でも紹介しました「Point Cloud Free Viewer」をAsset Storeからインポートして点群データを可視化していきたいと思います。
(Point Cloud Free ViewerはAsset Storeからインポートすることができる無料の点群ビューア)
■Assetをインポートして点群データを可視化
<1>Point Cloud Free Viewerのインポート
まずAsset Storeから「Point Cloud Free Viewer」をインポートしていきます。
Unityを起動してAsset StoreタブをクリックしてStoreを開きます。
検索キーワード入力欄に「point」、「cloud」とキーワードを入力して検索すると「Point Cloud Free Viewer」が表示されますので「インポート」ボタンを押します。
「インポート」ボタンを押すと「Import Unity Package」ウィンドウが表示されますのでさらに「Import」ボタンを押して読み込みを行います。
読み込みが完了するとProjectウィンドウのAssets内に「PointCloud」というフォルダが作成されます。
これでインポートは完了です。後は少し設定を変更するだけで点群データを表示することができます。
<2>Sceneの設定
次にScene内での設定をしていきます。
・Assets内の「Example」をダブルクリックしてSceneを開きます。
・Hierarchy内の「PointCloudManager」を選択してInspectorを表示させます。
・Inspector内のData Pathに記述されているパスが点群データのファイルパスになりますのでこの部分を用意した点群データに書き換えます。
※用意する点群データは「.off」データとなりますのでPCDデータ等の場合MeshLab等で「.off」データに変換します。
Playボタンを押して再生すると点群が表示されます。
後は、カメラの設定やGUIなどを追加していくことで表示させた点群を自由に動かしたり、ボタンアクションで点群を切り替えたりしてシミュレーターやアプリを作っていくことができます。
■点群を表示させるためのコード内容について
今回簡単に点群データを表示させるためにフリーのAssetを使用して表示する方法を紹介しましたが当然1からコードを書いて点群を表示させることもできます。
ここではコードを記述していく際の簡単な流れを紹介します。
<1>コード内容の流れ
①点群(off)データを読み込む
②offデータを行ごとに分解して格納していく
③各行に記述されているX,Y,Z,R,G,B,A(座標とRGBA色値)に分解して格納する
④読み込むオブジェクトの上限値を指定して制限以上になるとオブジェクトを分割していく
⑤格納した座標値、色値をMeshに生成していく
⑥Meshの頂点を表示させ点群として描画します(VertexColorの設定が必要)
.offファイル (Object File Format)はすべてASCIIファイルとなっており点群データの場合X,Y,Z,R,G,B,Aを数値で表現しているファイルのようです。
.pcdファイル等はバイナリデータで渡されることもあるのでフォーマットを限定するために「Point Cloud Free Viewer」ではoffデータでの読み込みにしているのではないかと推測します。
(間違っていたらごめんなさい)
以上の手順でコードを書いていけばUnityで点群データを描画することができるかと思います。
試しにUnityScriptでコードを書いてみましたが問題なく表示することができました。
追記:
・新規で1から作る場合VertexColorに設定する頂点表示用のShaderを作る必要があるようです。
・頂点表示用コードのMeshTopology.PointsはwebGLでビルドを行うと表示されないようです。
(Quads、Lines、LineStripは表示されますがPointsはダメなようです)
引き続き検証してみます。
■まとめ
これまで点群を可視化する際にはPCLを使用したビューアやJavascriptで表示させたりとアプリケーション開発を行うには敷居が高い感じでしたが、Unityで点群や3Dデータを扱えることで感覚的にアプリ開発が進められるのではという可能性を感じました。
Unity等のゲームエンジンは今後様々な用途で活躍できるアプリケーションかと思いますので引き続き可能性を探っていきたいと思います。
有限会社マグネットインダストリー
西内伸太郎