鉄工所の三代目がもがくblog

鉄工の仕事の話はほぼ出てこない

【Unity】続・タブレットで点群データを表示させたかった

今回も失敗談なのでiPad用の点群ビューアをお探しの方は"KiwiViewer"で検索をかけると宜しいかと。

(追記)kiwiViewrが64bit対応されないまま消滅してしまいました。

懲りずに再挑戦

前回の失敗はこちら。

thethird.hatenablog.com

前回はテキストの座標と色データをゲームオブジェクトに反映させて大量のオブジェクトを発生させた結果見づらい上に異常に重い残念な結果に終わりました。
懲りずに色々調べてみたところ、どうもスクリプトからメッシュを生成できるようなのでその方法で挑戦しました。

 


docs.unity3d.com

モノとしてはテキストの座標データと色を各要素ごとに分割して配列に格納しVector3のXYZ座標とColor32のRGBに突っ込んでそれをMeshFilterコンポーネントに代入する程度のスクリプトです。
Color32はbyte型、Colorはfloat型なので点群の生データの形式に合わせると宜しいかと。
ちなみにUnityではメッシュの頂点数は65000までなので、それを超えるデータを作る場合はオブジェクトを分ける必要があります。
スクリプトはこのへんの区切り方が酷い書き方なので割愛させて頂きたく・・・。
そしてメッシュの生成に成功したものの、色が反映されていません。
どうもシェーダ周りが問題な気がします。

f:id:kkei17:20151118194028p:plain

更に調べるとこんなサイトを見つけました。

Rendering a Point Cloud inside Unity • Kamen Dimitrov's Blog

ここのシェーダとEnablePointSizeスクリプトを拝借。
EnablePointSizeをカメラにアタッチするとこうなりました。
ちなみに上記リンクに座標からメッシュを生成するコードもあります。

f:id:kkei17:20151118194613p:plain
かなり間引いてるのでスカスカですが狙った通りに表示されました。
ここで喜んだのもつかの間、iPadに流し込むと残念な事に。

f:id:kkei17:20151118194938p:plain
EnablePointSizeを開いてみるとこんな記述がありました。

    const string LibGLPath =
        #if UNITY_STANDALONE_WIN
        "opengl32.dll";
    #elif UNITY_STANDALONE_OSX
    "/System/Library/Frameworks/OpenGL.framework/OpenGL";
    #elif UNITY_STANDALONE_LINUX
    "libGL";  // Untested on Linux, this may not be correct
    #else
    null;   // OpenGL ES platforms don't require this feature
    #endif

Macで開発しているのでその段階ではOpenGLのライブラリのお蔭で正常に表示できてるらしいが、iOSはその他扱い。
"OpenGL ES platforms don't require this feature"とのこと。
iOSOpenGL ESで処理してるからそもそもOpenGLのライブラリは読むに及ばんと言う事でしょうか。
必要ないとは言ってもそのままで問題なく動くというわけでもなさそうですが・・・。

求ム・解決方法

そんなわけで今回も未解決です。いい方法ないでしょうか。
一応WindowsOSXでは動くのでこの環境なら当初の目的である3Dモデルと点群の中を歩くといった事はできるという事にはなるといえばなるんですがこの環境でそんな物作っても今更感が半端ないわけで。
本命はあくまでiOS・・・。