点群データをUE4でボクセル表示　その２：Blutilityでボクセルを配置する

#はじめに
[点群データをUE4でボクセル表示　その１](https://qiita.com/reisyu/items/19bc49ee459252384d7e)につづいて、今回はテーブルの座標値と色情報をもとにBlutilityを使ってボクセルをレベルに自動で並べていきます。
完成したらボクセル市民会館を走り回ったり飛び回ったりできます！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">0.8mグリッド、20000ボクセル！都城市民会館らしさが大分わかるようになった！嬉しくて飛び回っております！<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/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a> <a href="https://t.co/HHAHrHuEUt">pic.twitter.com/HHAHrHuEUt</a></p>&mdash; reisyu (@reisyu1) <a href="https://twitter.com/reisyu1/status/1176050631624155136?ref_src=twsrc%5Etfw">September 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#環境
Unreal Engine 4.22.3

#Blutilityについて
UE4にはエディタ内でブループリントを使用して、コンテンツ制作タスクを自動化する[Blutility](https://docs.unrealengine.com/ja/Engine/Editor/ScriptingAndAutomation/Blueprints/index.html)というものがあります。これを使って大量のキューブを並べる処理を行っていきます。Blutilityを初めて使ってみたので理解不十分なのですが、とりあえず動作はした方法ということで・・・。
今回もMozPacaさんのブログを参考にさせていただきました。
「UE4初心者が頑張ってるブログ　[UE4 4.20 BlutilityとEditor Scriptingを試してみる その1](http://mozpaca.hatenablog.com/entry/20180711/1531295824)」

#Editor Utility BPを作成
エディタの環境設定の実験段階の中にある Editor Utility Blueprints (Blutility) にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/ca857b8d-a6e0-56f1-06e8-624ccecb91d9.png)

MozPacaさんのブログに従ってコンテンツブラウザからブループリント > ブループリントユーティリティを選択と選ぼうと思ったのですが見当たりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b3441c95-dd57-fe2b-36fa-dfda6b059507.png)

ブループリントではなくEditor Utilityの中にありました。UE4のバージョンによってこのあたりの操作が異なるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/8f2f5124-5c7d-e630-347e-1a7d01204daa.png)

GlobalEditorUtilityBaseを選択して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/38ac7e27-77f1-ee50-c3fc-925d88711fed.png)

`PlaceVoxel_BU`という名前で作成。右クリックしてブループリントを編集を選択して開きます。（ダブルクリックするとBlutilityの実行画面になってしまいます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a16edca6-1683-bf44-e2fb-314647008730.png)

##カスタムイベントを作成
カスタムイベントを作成し、`PlaceVoxel`と名前を付け、エディタで呼び出すにチェックを入れておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7602a177-6434-819d-56ad-09b0c3ea4175.png)

##データテーブルを読み込む
Get Data Table Rows Names の Table に `VoxelTable`を指定しテーブルの行名を配列として取得します。そこに For Each Loop と Get Data Table Rowをつなぎで各行の内容を取得するループを回します。後の整理のためにFor Each Loop の後ろに Sequence ノードをかましておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/c5e0371c-e3f2-e81a-a9de-3defc27e50f0.png)

##ボクセルの位置ベクトルと色情報を作成
Get Data Table Rowの外側の列ピンから引き出してVoxelTable_STRを分解を選択するとテーブルの各列の値を取り出せます。
Px,Py,PzピンをMakeVectorノードに繋いでボクセルの位置ベクトルを作成していますが、Y-up座標を、Z-up座標に変換するためPyをZに、Pzに-1を掛けてYにつなげています。さらに距離の単位をmからcmにするために100を掛けます。その結果を変数に昇格し`PosVector`と名前を付けました。
Cdx,Cdy,CdzピンはMakeColorノードのR,G,Bピンに繋ぎ、その結果を変数に昇格し`VoxelColor`と名前を付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7a8ebf13-4da0-78da-91df-1350c13b3b0a.png)

##ボクセルを配置
いよいよボクセルを配置していく作業です。先ほど作っておいた Sequence の Then1ピン につなげていきます
Spawn Actor from Object の Object to Use には`Voxel_BP`を選択。Locationピンには先ほど作成した変数`PosVector`を繋げます。ボクセルのサイズをコントロールするfloat変数`VoxelSize`を作成し、Set Actor Scale 3D のNew Scale 3Dピンに繋げます。
次にCast to Voxel_BPノードを作成し、As Voxel_BPピンからSet Voxel Colorノードを作成し、変数`VoxelColor`を繋げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/ced52a7d-afc7-eba8-1680-f8f5456def02.png)

PlaceVoxel_BU が完成しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/2ee75643-f176-3e30-c549-83950f93da9f.png)

#PlaceVoxel_BUの実行
コンテンツブラウザからPlaceVoxel_BUをダブルクリックするとBlutilityを実行するウィンドウが開きます。パブリック変数`Voxel Size`を指定してカスタムイベント`PlaceVoxel`を実行するボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/3d49f828-42bd-1542-ccf5-556e6ca315ad.png)

最終的にはBlutilityを使って約20000個のボクセルを自動で配置できました！！（20000個をBlutilityで一気に処理するとエディタが落ちてしまったので5000個ずつ分けて処理しました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/ba820c29-6cbe-948d-6371-2cd691a246b8.png)

#まとめ
Bultilityは超強力なツールですね！Construction Scriptと組み合わせるとプロシージャルなレベル作成の自由度が高まりそうです。試行錯誤しながら色々と活用できるようになりたい！

もっとボクセルを細かくしてみたいのですが、今回の方法ではどんどん重たいデータになってしまいそうです。アクタのマージ、スタティックメッシュへ変換、Instanced Static Meshなどを使えば軽く動かせるようになるのでしょうか？

今回のやり方は突っ込みどころ満載の内容だと思うので、こんな方法もあるよとかアドバイスをいただけると嬉しいです！

#参考
[点群データをUE4でボクセル表示　その１：色を変更できるキューブを作る](https://qiita.com/reisyu/items/19bc49ee459252384d7e)
「UE4初心者が頑張ってるブログ　[UE4 4.20 BlutilityとEditor Scriptingを試してみる その1](http://mozpaca.hatenablog.com/entry/20180711/1531295824)」
[旧都城市民会館の点群データが完成！](https://camp-fire.jp/projects/158741/activities/97179)