Reconstruct 3D environment~pointcloudのmesh化~
2015/3/16
Tag: cloud,environment,Houdini,maya,mesh,point,pointcloud
どーもお久しぶりです。開発部ゴトー[@jackybian]です。
寒~い冬もようやく終わりを迎え徐々に春が近づいてきてますね。同時に花粉が飛び始め、未だ花粉症を認めていない自分ですが
今年はさてどうなることやら。そんなこと言ってるうちに花見の時期になるんでしょうけどね(゚∀゚)ノワーイ
さて今回は検証で撮ってみた点群データ(以下、PCと表記)のMesh化についてのお話です。
と言っても今回は流体計算したparticleのMesh化とかではなくレーザースキャナーで撮影された環境のMesh化です。
これはLightingで使うためですが、この手のものでよく見るのは建物や室内などの人工物で出来た環境が多いように思います。
今回スキャンしたのは樹木が生い茂る森の中です。つまり自然物で囲まれた環境ということになります。
ご経験のある方がいらっしゃれば想像に難くないと思いますが、多種多様な植物が入り混じり複雑極まりない環境となります。
このようなPCデータをどのようにしてMesh化したかについてのお話をしようと思います。
PCデータって?
一般的にレーザースキャナーは放射状にレーザーを照射して環境に当たった位置をPointデータとして格納します。
従ってレーザーが何かに当たった箇所のその先の情報までは取得できません。
例えば木の幹であればレーザーが当たった側の情報はあれど裏側の情報は無いということになります。
そのため複数の場所からスキャンしたデータを繋ぎ合わせ、これらを補う手法をとりますがこうして得られたPointCloudデータもそのままMesh化に使える訳ではなく、精度の低い箇所やノイズによる不要な点が含まれています。
また精度良くスキャン出来た箇所でもMesh化するに当たってはそこまでのディテールがいらない場合もあります。
例えば地面には多くの植物が生えてますが傾斜レベルのディテールで良く、植物のディテールはむしろ必要ない場合など。
このように用途に応じて不要な点を除去するCleanUp作業が必要になります。
今回は葉の部分を除去して、木(幹・枝)の部分のみをMesh化することが目的です。
CleanUpについて
どのようにして不要な点を除去したかですが、大きく3つの段階に分けてCleanUpしました。
1. 全スキャンPointのうち必要な空間の点のみを残す
2. ノイズPointや離散的なPointの除去
3. 木(幹,枝)と葉のPointを分離
このうち、処理1は大したことはないのですが、処理2は多少、処理3はかなり難航しました。
処理1を終えた段階で11,422,743頂点のPLYファイル(ASCII:928MB)でした。
過去に他部署のスタッフが建物などの人工物からなる背景をMesh化した事例があるとのことで聞いたみたところ
MeshLabやMephisto Processという複数のツールを使ってMesh化する方法でした。
自分も今回初めてPointCloudのMesh化をやったので最初はこの方法で不要なPointの除去から始めてみたものの
View上でのカメラ操作、不要なPointの選択⇒削除といった何度も繰り返し行う操作が非常にやり辛く、Undo機能の非力さもあり
とてもコストのかかる作業でした。この時点でかなりヤバい臭いがプンプンでしたが一旦この問題は置いておき、
CleanUpが出来たことを前提にPCデータのMesh化のテストに移りました。
が、こちらも最初のテストで嫌~な予感はみごと的中!
かなり計算時間がかかる上、結果が予測しづらく長時間かけてMesh化したはいいものの結果が全然ついてこない!
このやり方してたらいつになったらデータが上がるのか?ってくらいで正直震えました((;゚Д゚))ガクブル
(まぁ初めて使うソフトだというのもあり本当はもっと良いやり方があった可能性は否めませんが…)
CleanUpもMesh化も相当キツイってことがわかったのでCleanUpだけでも使い慣れたXSIやMayaで出来ないかと画策したところ
処理2はある程度はいけたんですが、処理3やMesh化処理についてはPoint数の多さもありやはり厳しい状態でした。
やはりデータを分割してパート毎にチクチクやっていくしかないかぁ。。。と途方に暮れていた時です。
神からお告げがっ!! “Houdini~VDB~♪”
HoudiniのVDBによるMesh化
そこで早速Houdiniを起動して11,422,743頂点のPLYファイルを読み込んでみたところ、サクサクで操作感もいい感じ~♪
という訳でVDBを使ったMesh化に挑戦!(といっても今回Houdiniほぼ初体験ですのでその点ご容赦ください)
まずは軽いPLYデータでまずはテスト。
1. fileノードでPLYデータを読み込み
2. Transformノードで位置や大きさを調整
3. VDB from Particle Fluidノードを作成してTransformノードをコネクト
4. ノードのパラメータを設定してVDB化
※Paticle Separation, Voxel Scale, Influence Scaleで解像度を調整
5. Convert VDBノードを作成。VDB from Particle Fluidノードとコネクト
6. ノードのパラメータを設定してPolygon化
多少パラメータやMemory使用にコツがあるもののMeshLabでやるよりはるかに処理も高速!
データハンドリングもしやすくいい感じなのでMesh化はこれに決定!
最大の難関!? 木と葉のPoint分離
あとは棚上げしていた”木と葉の分離”処理ですが、ある程度自動で分離が出来ないかとフィルター系を試したのですが、
●密度や距離によるフィルター ⇒ 分離には情報が不十分
●Vertex Colorによるフィルター ⇒ 天候の影響もあり色にあまり統一性がない
の理由から自動で分離するのは困難でした。
ということで今回は手作業での分離というなんともアナログな方法で対応せざるを得ませんでした。
ただでさえ複雑な森の中というシチュエーションの中、悪天候とタイトな撮影スケジュールで十分なスキャンができず
●人の目で見ても枝と葉の境界が判断しづらい箇所が盛り沢山!
●木の本数も半端ない!
で兎にも角にもこの作業が一番骨の折れる作業でした(´Д⊂ヽ
今後は木(枝)や葉の特徴を利用するようなアルゴリズムである程度自動化したいなぁ。。
良いアイデアをお持ちの方は是非ご一報頂けたら幸いです!
Mesh化の最終結果と考察
面倒な分離作業を終え最終的な木のMesh化&葉のPC化した結果がこちら↓
今回”樹木に囲まれた自然環境”のMesh化をやってみて
●可能な限り多くの地点からスキャンを行い、密度・精度の高いPCデータを得ること
●CleanUpツール、Mesh化ツールの選定には十分検討を!(HoudiniのVDB利用方式はかなり良かったと思っています)
●”木と葉の分離処理”には自動化などの改善が望まれる
といったことが重要だと思います。
どこまでをMesh化するか?にも因りますが建物や室内のような人工的な環境に比べるとやはり大変でした。
もし同じような環境をMesh化する方に少しでもお役に立てば幸いです。
最後に
実際にはLightingに使うデータにするにはこの後にもまだ作業があります。
・Polygon Reduction
・HDR Projection
・Import PC(※葉の部分も位置や形の参照用にPCのままMayaへ)
などがありますがお時間がきたので今回はここまでにします。またいずれ何処かで。では(´∀`*)ノ マタ~
Special Thanks to M & H!😀
※免責事項※
本記事内で公開している全ての手法の有用性、安全性について、当方は一切の保証を与えるものではありません。
これらの手法を使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご活用ください
コメント
コメントフォーム