Point Cloud DataをUnreal Engineで

vlcsnap-2017-01-05-17h05m29s8813DCGI的にというか,ゲームエンジン(Unreal Engineなど)は点群データを表示するのには向いていない(ポリゴンメッシュじゃない!)

でもLiDARとか最近のものを使っていると点群データを出したいときはよくある.

点群データをゲームエンジンで!

方法としては,

  1. 点群データを事前にメッシュ化する(CloudCompareとか使って)
  2. ゲームエンジンで用意されているプラグインなどを使う
  3. 点群データをゲームエンジンが読める形式にする

なんかが考えられる.

1はすでに試してあり,比較的簡単にできるけど,どうしてもメッシュ化するときにモッコリすることが多い.

2はプラグインが出るのを待つ(Unityは最近読めるらしい)か,自作する.

ということで3をやってみた.(いろいろ調べてここに行き着いた.基本的にはここを読んで貰えばわかります.)

点群データの読み込み方

まずゲームエンジンが高速に処理できる方式にする.3DCGIで高速に大きなサイズを読むといえば,テクスチャ!ということで,点群データのx,y,zをR,G,Bに置き換える.

これが

screen-shot-2017-01-05-at-16-37-08
647745点の点群データ.LiDARデータを元にSLAMって作成.

こうなる.

outputimage
647745点の点群データなので,1024×1024(=1048576) . 512×512(=262144)では足らない.

具体的には精度を最大にするために

  1. x,y,zのそれぞれのMIN,MAXを求め,一番幅が広い変数を基準にし
  2. それぞれを,基準の変数を元に0-255に収める.
  3. それを画像の各ピクセルに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

4 Comments Add yours

  1. neoplanetz says:

    Hi, Ishiguro, First of all. Thanks for your posting about point cloud data on UE4. Don’t you try to render point cloud data from Lidar or Velodyne or Kinect v2 in UE4 on realtime ? I’m currently researching that I explain above.

    1. ishi96440 says:

      Hi, thank you for your comments.
      No, I’ve not tried yet.
      In this post, I described displaying method for off-line point cloud data (Sorry, this page was written in Japanese…).
      I want to try it and I have some idea but I have no time… 😛

  2. Soso says:

    Hello, Thank you for your post. I wish I could understand what you wrote 🙂
    I have points in 3D space that I have to represent using point could through UE4. Your post it seems help me to do that could you please help me to know the steps in english…

    1. ishi96440 says:

      Thank you for reading. I think it was a hard time for you.
      I should write these posts in English.

      The simple procedure is as follows:
      1. Convert PCD data to texture image.
      I created a simple script by myself.
      It convert the coordinate data (XYZ) to RGB.

      2. Read this as a texture and retrieve each pixel value.

      3. Place a point based on that value.

      I referred to the following link:
      https://forums.unrealengine.com/showthread.php?91501-How-to-place-single-GPU-particles-at-specified-locations

      🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s