点群データをHoudiniでボクセル表示する

#はじめに
Houdiniを使って３Ｄスキャンによる点群データをマイクラ風のボクセル表示にする手順のまとめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/64e08031-0b8b-8307-de8b-47963213ef68.png)
点群データは東京藝術大学の金田充弘研究室とgluonの取り組まれている[デジタル芸大プロジェクト](https://twitter.com/i/moments/1090446353371545600)のものを使わせていただき『ボクセル藝大』を作ってみました。

【2019/9/12 追記】同じ方法でボクセル化した都城市民会館です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ボクセル市民会館からの点群市民会館からのボクセル市民会館<br>旧都城市民会館の汎用版点群データがオープンソースとして公開されました！<a href="https://twitter.com/hashtag/3DDA?src=hash&amp;ref_src=twsrc%5Etfw">#3DDA</a> <a href="https://twitter.com/hashtag/%E6%97%A7%E9%83%BD%E5%9F%8E%E5%B8%82%E6%B0%91%E4%BC%9A%E9%A4%A8?src=hash&amp;ref_src=twsrc%5Etfw">#旧都城市民会館</a> <a href="https://twitter.com/hashtag/Houdini?src=hash&amp;ref_src=twsrc%5Etfw">#Houdini</a> <a href="https://t.co/mp7q5jCeBm">pic.twitter.com/mp7q5jCeBm</a></p>&mdash; reisyu (@reisyu1) <a href="https://twitter.com/reisyu1/status/1171900821652430848?ref_src=twsrc%5Etfw">September 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
都城市民会館の点群データはこちらで公開されています！
[旧都城市民会館の点群データが完成！](https://camp-fire.jp/projects/158741/activities/97179#main)

#環境
Houdini 17.5.229
CloudCompare 2.10.2

#CloudCompareで点群のデータ形式を変換
HoudiniはE57, LAS形式の点群データを読み込むことができます。今回の元データはpts形式だったので[CloudCompare](https://www.danielgm.net/cc/)でE57形式に変換しました。

#Houdiniでボクセル化する手順
##STEP 1　準備
Geometryノードを作りその中に入り、Nullノードを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a8e81415-33e0-1d72-aca3-8942f7446687.png)

Nullノードの名前をCONTROLLERに変更し、ボクセル化をコントロールするためのパラメータを登録します（堀川さん方式です）
・GridSize：Gridの間隔を指定（0.2 → 0.2m = 200mm）
・Gap：ボクセルとボクセルとの隙間（0.02 → 0.02m = 20mm）
・NoiseParm：ばらつきを持たせるための係数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/e80bd64a-1333-ab1a-0506-c514ef5692ba.png)

##STEP 2　点群を読み込む
[Lidar Import](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/lidarimport)ノードを作成し、 File でE57ファイルを指定、 Color を`From Point Cloud`に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b5437b9b-77a7-19a4-1bd0-43d5398e4f6c.png)

点群データを読み込めましたがスケールと向きがおかしい？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a55d9593-7d3b-72ea-e579-df39cccdbe30.png)

##STEP 3　スケールと向きを調整
今回の点群データはmm単位、Z-upになっています、Houdini はm単位、Y-upなので調整が必要です。
[Transform](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/xform)ノードを作成し、インプットにLidar Import のアウトプットをつなぎ、 Rotate X を`-90`に Uniform Scale を`0.001`に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b03ce63e-fbe1-a1b5-a39d-6eec8514d95f.png)
点群データは原点からかなり離れた位置になっていることもあります。その場合は Move Centroid to Origin を押すとジオメトリの重心が原点になるようにTranslateに自動で数値が入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/49048540-f4bc-9da0-af15-fe3e8df8c168.png)

調整できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/2dad37e0-3fe6-33f3-86b5-a103f573594b.png)

正門のあたりを拡大するとこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/52c3aee1-a76d-2594-a7d2-3d8ea075b765.png)

##STEP 4　点群をグリッドに乗るように間引く
[Fuse](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/fuse)ノードを作成し、一つ目のインプットにTransformのアウトプットをつなぎます。Snap To を `Grid` にして Grid Spacing に STEP1で作成したパラメータ GridSize を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/68977b3f-f40b-9ef8-91c5-3b8872da6284.png)

GridSizeで指定した間隔になるようにポイントを間引くことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/16f6f88b-c9fe-44d6-987a-56ce74661f92.png)

##STEP 5　ポイントの位置にボックスを配置する
[Box](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/box)ノードを作成し Uniform Scale を STEP1で作成したパラメータの「GridSize から Gap を引いた値」にします。
[Copy to Points](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/copytopoints)ノードを作成し、一つ目のインプットにBoxのアウトプットを、二つ目のインプットにFuseのアウトプットをつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/581fee7a-3dd7-38fd-292d-375f15649dfe.png)
ボクセル化できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/6e70001e-fe6b-86f8-e867-f247e57f0424.png)
ですが・・・きれいに並びすぎていて味気ないように思います。

##STEP 6　ボックスの配置をばらつかせる
FuseノードとCopy to Pointsノードとの間に[Attribute Noise](https://www.sidefx.com/ja/docs/houdini17.5/nodes/sop/attribnoise)ノードを追加しました。
Attributes に `P` 、Amplitude を STEP1で作成したパラメータの「GridSize に NoiseParm を掛けた値」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/3399b575-8ddc-4243-dd5c-9564d14c607b.png)
ノイズなし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/8a9dff1d-c15e-3f7c-ddad-a8b3bd75659a.png)
ノイズあり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a944b8b3-792e-24f2-b2f0-963accc02a2c.png)

#まとめ
ネットワークの全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/0b64c580-fafc-6b0f-1cf2-4288dcf6f5b1.png)
Lidar Import と Fuse を使ってシンプルな手順でボクセル化できました！

#参考
[点群VR「点描芸大」まとめ](https://togetter.com/li/1332227)
[メタボリズムの名建築『旧都城市民会館』を3 次元スキャンで記録に残したい。](https://camp-fire.jp/projects/view/158741)