Point Cloud DataをUnreal Engineで

3DCGI的にというか,ゲームエンジン(Unreal Engineなど)は点群データを表示するのには向いていない(ポリゴンメッシュじゃない!) でもLiDARとか最近のものを使っていると点群データを出したいときはよくある. 点群データをゲームエンジンで! 方法としては, 点群データを事前にメッシュ化する(CloudCompareとか使って) ゲームエンジンで用意されているプラグインなどを使う 点群データをゲームエンジンが読める形式にする なんかが考えられる. 1はすでに試してあり,比較的簡単にできるけど,どうしてもメッシュ化するときにモッコリすることが多い. 2はプラグインが出るのを待つ(Unityは最近読めるらしい)か,自作する. ということで3をやってみた.(いろいろ調べてここに行き着いた.基本的にはここを読んで貰えばわかります.) 点群データの読み込み方 まずゲームエンジンが高速に処理できる方式にする.3DCGIで高速に大きなサイズを読むといえば,テクスチャ!ということで,点群データのx,y,zをR,G,Bに置き換える. これが こうなる. 具体的には精度を最大にするために x,y,zのそれぞれのMIN,MAXを求め,一番幅が広い変数を基準にし それぞれを,基準の変数を元に0-255に収める. それを画像の各ピクセルにR = x(0-255), G = y(0-255), B = z(0-255)として書き出す. で作成できる. これからわかるように,各8bit(256階調)の場合,256分割しかできない.例えばLiDARの精度が1cm程度だとすると,全点群データが 2m 四方程度に収まっていれば精度は落ちにくいが,それ以上だとさらなる工夫が必要.参考文献だと16ビットPNGにする,HDRを使うとかあるけれど,とりあえず8bitでやってみる. 精度確保 使った点群は,大学キャンパスの一部(100m四方程度)なので,256ではかなりの精度低下になってしまう.そこで簡単な工夫としては,複数テクスチャに分けるっていう手がある.上記の0-255を0-65536(16bit)で収め,255で割ったときの商と剰余に分けてそれぞれテクスチャとして書き出し,ゲームエンジン上で元に戻せば,いきなり倍精度になる,と. UnrealEngine 4.13での読み込み 事務仕事が舞い込んだので,後日... とりあえず結果だけ.うーんスムーズ! Advertisements