Unityに大量の点群を表示する手順

# はじめに
<!-- 発端や概要を記載 -->
この記事では，大量の点群データをUnityに表示させるまでの手順を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/1aa48da5-3981-bd58-8a43-b13a5bad0f8b.png)

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [実行環境](#実行環境)
1. [点群データをlas形式に変換](#点群データをlas形式に変換)
1. [lasファイルをpotree形式に変換](#lasファイルをpotree形式に変換)
1. [UnityにBA_PointCloudを導入](#UnityにBA_PointCloudを導入)
1. [Unity・BA_PointCloudの設定](#Unity・BA_PointCloudの設定)
1. [結果](#結果)
1. [参考文献](#参考文献)

<!-- 各チャプター -->

# 実行環境
・Windows11
・Unity 2021.3.19f1
・CloudCompare V2 (点群編集用ソフト)
・PotreeConverter 2.1.1 (点群ファイル形式変換コンバータ）

# 点群データをlas形式に変換
点群データをlas形式に変換します。

las形式への変換には，[CloudCompare](https://www.danielgm.net/cc/)というフリーソフトを使用します。

点群データをCroudCompareにドラッグアンドドロップし，点群データを開きます。
今回は，ply形式のファイルを変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/115ccb9c-9960-eb20-e6b3-2296044b6923.png)

大規模なデータの場合，必要に応じて点群データの間引きなどを行います。
***
### las形式で保存
DB Treeから，点群データをクリックし，選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/e75c8bab-8da3-f0fa-7d2f-8b690fbe7219.png)

上のツールバーFile>Saveをクリックし，las形式で保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/96b993ab-983c-2df1-9e50-3d7df6b9e622.png)
***
因みに，色を確認したい場合はProperties>Color>RGBで点群の色を表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/1add3e25-605e-75af-549d-0e33d316e7ca.png)
<a id="#Chapter2"></a>
# lasファイルをpotree形式に変換
potree形式とは，大量の点群データを効率的に表示するための形式です。
遠くのオブジェクトは粗く、近くのオブジェクトは細かく表示するLODや，空間分割し動的に読み込みを行うことにより，高速に表示することが可能になります。

### 手順
先ほど変換した，**las形式**の点群データを**potree形式**に変換します。

以下のコンバーターをダウンロードし，zipファイルを展開します。
[PotreeConverter](https://github.com/potree/PotreeConverter/releases)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/4ac3c15d-c229-7f9b-764a-9dc83371b11e.png)

ダウンロードが完了したら、好きな場所に出力用のフォルダを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/d96b493f-3df1-dfb6-016c-3c1dc275de55.png)


PotreeConverterのフォルダで，**パスにcmdと入力**し，コマンドプロンプトを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/9bcc56e9-3474-861d-7578-b7cb3f2c04ed.png)

コマンドプロンプトで以下のコマンドを実行します。
（ファイルパスは，ドラッグアンドドロップでもコピーできます）
```
PotreeConverter.exe <lasファイルorフォルダのパス> -o <出力フォルダーのパス>
```
**注意：ファイルパスに日本語が存在すると正常に実行されない可能性があります。**

成功すると以下のようなlogが表示されるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/efc4ae9a-3579-c8e6-273e-17349f4cd30f.png)

出力先のフォルダに，以下のようなファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/12153fdf-5a1b-746b-50a2-6ebc7d9a2985.png)

これでPotree形式への変換は完了です。

# UnityにBA_PointCloudを導入

Unityで新規プロジェクト(3D)を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/a372543f-8286-d134-aa37-ef3a9cffdaec.png)

[BA_PointCloud](https://github.com/SFraissTU/BA_PointCloud/releases/)をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/236b086a-9315-c645-d69a-d6d681010352.png)

unitypackageをダウンロードし，ファイルをダブルクリックすると，Unityで以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/84325faa-9369-2377-6ff3-c5d6974a3616.png)
**すべての項目をチェック**し，「Import」をクリックします。

# Unity・BA_PointCloudの設定

Assetsフォルダ内に，「**StreamingAssets**」というフォルダを新規作成します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/9fb454bb-3c7f-02b0-a80e-7f615cf44257.png)

>注意："StreamingAssets"という名前を間違えないようにしてください。このフォルダを作成することで，スクリプトから簡単に点群データファイルを参照できるようになります。

StreamingAssetsフォルダ内に，**Potree形式に変換した点群データのフォルダを配置**します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/ec36f4fe-c392-7afb-160c-562b4a0f85a1.png)

***
Sceneで右クリック＞CreateEmptyをクリックし，空のGameObjectを3つ作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/ab654b14-2663-5db7-0875-b5b64c54d64d.png)

わかりやすいように，以下のように名前を変更します。
- DynamicPointCloudSet
- PointCloudLoader
- DefaultMeshConfigration

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/63beac16-0772-b51c-4641-1d639cda693d.png)

それぞれのゲームオブジェクトを設定していきます。
***
### DynamicPointCloudSet
ゲームオブジェクトに「DynamicPointCloudSet」コンポーネントを追加します。

**Inspector > Add Component > Dynamic Point Cloud Set** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/262f12c4-f8cd-534e-fd3b-c2f5f7239c0d.png)
***
「PointCloudLoader」「DefaultMeshConfigration」でも，同じ操作を行っていきます。
### PointCloudLoader
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/f3c2f7e9-0674-724f-255d-6f59762c0009.png)

### DefaultMeshConfigration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/677cd3ab-3d9e-8b74-abe2-a5b1f2c48c66.png)

***
それぞれのコンポーネントの設定を行います。
### DynamicPointCloudSet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/ef8b5528-ef76-9100-1fcc-d340b41a2743.png)
- **MeshConfigration** : DefaultMeshConfigrationを設定
- **UserCamera** : MainCameraを設定
※gameObjectをドラッグアンドドロップでも設定できます。

### PointCloudLoader
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/c1152518-e1e1-e542-845a-b0ebad7bbc17.png)
- **CloudPath** : StreamingAssetsフォルダに配置した点群データの**フォルダ名**
- **StreamingAssetsAsRoot** : True
- **SetController** : DynamicPointCloudSetを設定

### DefaultMeshConfigration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/cedd4d49-cf7f-78e3-c479-7e86398a8c6f.png)

RenderCamera以外は，必要に応じて設定します。
- **RenderCamera** : MainCameraを設定
- **PointRadius** : 点の半径
- **RenderCircles** : falseで四角の点 / trueで円の点を描画
- **ScreenSize** : falseで点が遠近法で描画 / trueで全ての点のサイズが等しく描画
- **Interpolation** : 補間モード
- **Reload** : trueでアプリ実行中にこれらの設定の変更を反映
- **DisplayLod** : ロードされた Octree ノードの境界ボックスを表示

***
### MainCamera
最後に，カメラを操作できるようにMainCameraに「CameraController」コンポーネントを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/e76011dd-0127-9f46-66b6-a8508dabd895.png)
これにより，プレイ中にキーボードでカメラ操作ができます。

<a id="#Chapter5"></a>
# 結果
実行すると，Unity上に点群データが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192833/1aa48da5-3981-bd58-8a43-b13a5bad0f8b.png)


<a id="#reference"></a>
# 参考文献

https://qiita.com/uioyuio/items/cc557e2da88f801ad6a8

https://github.com/SFraissTU/BA_PointCloud

https://github.com/potree/PotreeConverter