#はじめに
Houdiniを使って3Dスキャンによる点群データをマイクラ風のボクセル表示にする手順のまとめです。
点群データは東京藝術大学の金田充弘研究室とgluonの取り組まれているデジタル芸大プロジェクトのものを使わせていただき『ボクセル藝大』を作ってみました。
【2019/9/12 追記】同じ方法でボクセル化した都城市民会館です。
都城市民会館の点群データはこちらで公開されています! [旧都城市民会館の点群データが完成!](https://camp-fire.jp/projects/158741/activities/97179#main)ボクセル市民会館からの点群市民会館からのボクセル市民会館
— reisyu (@reisyu1) September 11, 2019
旧都城市民会館の汎用版点群データがオープンソースとして公開されました!#3DDA #旧都城市民会館 #Houdini pic.twitter.com/mp7q5jCeBm
#環境
Houdini 17.5.229
CloudCompare 2.10.2
#CloudCompareで点群のデータ形式を変換
HoudiniはE57, LAS形式の点群データを読み込むことができます。今回の元データはpts形式だったのでCloudCompareでE57形式に変換しました。
#Houdiniでボクセル化する手順
##STEP 1 準備
Geometryノードを作りその中に入り、Nullノードを作ります。
Nullノードの名前をCONTROLLERに変更し、ボクセル化をコントロールするためのパラメータを登録します(堀川さん方式です)
・GridSize:Gridの間隔を指定(0.2 → 0.2m = 200mm)
・Gap:ボクセルとボクセルとの隙間(0.02 → 0.02m = 20mm)
・NoiseParm:ばらつきを持たせるための係数
##STEP 2 点群を読み込む
Lidar Importノードを作成し、 File でE57ファイルを指定、 Color をFrom Point Cloud
に変更します。
##STEP 3 スケールと向きを調整
今回の点群データはmm単位、Z-upになっています、Houdini はm単位、Y-upなので調整が必要です。
Transformノードを作成し、インプットにLidar Import のアウトプットをつなぎ、 Rotate X を-90
に Uniform Scale を0.001
に設定します。
点群データは原点からかなり離れた位置になっていることもあります。その場合は Move Centroid to Origin を押すとジオメトリの重心が原点になるようにTranslateに自動で数値が入ります。
##STEP 4 点群をグリッドに乗るように間引く
Fuseノードを作成し、一つ目のインプットにTransformのアウトプットをつなぎます。Snap To を Grid
にして Grid Spacing に STEP1で作成したパラメータ GridSize を設定します。
GridSizeで指定した間隔になるようにポイントを間引くことができました。
##STEP 5 ポイントの位置にボックスを配置する
Boxノードを作成し Uniform Scale を STEP1で作成したパラメータの「GridSize から Gap を引いた値」にします。
Copy to Pointsノードを作成し、一つ目のインプットにBoxのアウトプットを、二つ目のインプットにFuseのアウトプットをつなぎます。
ボクセル化できました!
ですが・・・きれいに並びすぎていて味気ないように思います。
##STEP 6 ボックスの配置をばらつかせる
FuseノードとCopy to Pointsノードとの間にAttribute Noiseノードを追加しました。
Attributes に P
、Amplitude を STEP1で作成したパラメータの「GridSize に NoiseParm を掛けた値」を設定します。
ノイズなし
ノイズあり