Cesium for Unityを使って3D Tiles形式のPLATEAUデータを表示する

## はじめに
:::note info
これは [MIERUNE AdventCalendar 2022](https://qiita.com/advent-calendar/2022/mierune)　21日目の記事です。
昨日は @kntoshiya さんによる [QGISのフィールド計算機などにおける式についてまとめてみた](https://qiita.com/kntoshiya/items/217cab81e4e6b37d8918) でした。
:::

今年の11/30に発表された、Cesium for Unityを使って3D Tiles形式のPLATEAUデータを表示してみたいと思います。

@northprintさんによる、[Cesium for Unity クイックスタート](https://qiita.com/northprint/items/ba9c0760ad359cadf66d) とテーマが一緒でした！
私とは少し違う手順で実施しているようなので、ぜひこちらの記事も読んでみてください！

### 動作環境
OS: Window 10
Unity Hub: バージョン3.2.0
Unity: バージョン2021.3.16f1

### PLATEAUとは
#### 概要
国土交通省が主導する3D都市モデル整備・活用・オープンデータ化プロジェクトです。
3D都市モデルには、家屋やビルなどの「建築物」、都市計画区域などの「都市計画決定情報」、土地の用途を示した「土地利用」、都市のインフラである「道路」や「橋梁」など、都市に関するデータが格納されています。

#### データ形式
PLATEAUデータには、様々なデータ形式があります。
例えば、CityGML、3D Tiles、MVT、ファイルジオデータベース、OBJ、FBXなどなど。。
今回はCesium for Unityを使うので、「3D Tiles」を採用します。

#### データの取得
データは[G空間情報センター](https://www.geospatial.jp/)からダウンロード可能です。
また、PLATEAU公式が[PLATEAU配信サービス（試験運用）](https://github.com/Project-PLATEAU/plateau-streaming-tutorial)で3D Tilesを配信しています。
データのダウンロードが不要になるので、今回は配信サービスを利用します。

#### LOD
LOD（Level of Detail）とは、3D都市モデルに含まれている地物の詳細度です。
建築物はLOD0からLOD4までが定義されています。

![image](https://www.mlit.go.jp/plateau/uploads/2022/11/about_citygml_02.png)
画像の出典：[国土交通省 Project PLATEAU](https://www.mlit.go.jp/plateau/learning/tpc01-2/#p1_3_2)

### Cesiumとは
3Dの地理空間アプリケーションを作成するためのプラットフォームです。
いくつかのソリューションがあり、代表的なものは以下になります。

- Cesium ion
- CesiumJS
- Cesium for Unity
- Cesium for Unreal
- Cesium for O3DE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/3f54d525-f669-aaec-9405-ec3a7168a3d1.png)
画像引用：[The Cesium Platform](https://cesium.com/platform/)

https://cesium.com/platform/

### Unityとは
Unityは、Unity Technologiesが開発・販売しているゲームエンジンです。

個人で、収入ならびに資金調達(自己資金を含む)の過去12ヶ月の合計が年間 10 万ドルを超えない場合、無料で利用できます。
所属する会社の年間収益、ならびに資金調達(自己資金を含む)の過去12ヶ月の合計が20万米ドル以上の場合は有償ライセンスが必要です。
（2022/12/17時点の情報です。最新の情報は公式サイトを参考にしてください。）

https://forpro.unity3d.jp/plan/

UnityでPLATEAUデータを表示する手順については[こちらの記事](https://qiita.com/asahina820/items/98aee46fbebb708579bf)をご覧ください。

### Cesium for Unityとは
Cesiumの3D地理空間機能と、3D TilesをUnityエコシステムと組み合わせることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/fe37fab6-6fee-c99a-7399-4b5771b72834.png)

画像引用：[Cesium for Unity](https://cesium.com/platform/cesium-for-unity/)

## 手順
### Cesium for Unity用ファイルダウンロード
[Cesium for Unity公式](https://cesium.com/platform/cesium-for-unity/)を開きます。

「GET STARTED」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/dc4d85c3-72ce-fad8-850a-bb2c1b2027ff.png)

クリックすると、Releaseページに遷移します。
執筆当時はバージョン0.1.1でした。

https://github.com/CesiumGS/cesium-unity-samples/releases/tag/v0.1.1

Assetから、CesiumForUnitySamples-v0.1.1.zip をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/a12cc83f-a546-e399-4b98-308b7a616a3e.png)

ダウンロードしたZIPファイルを任意のフォルダに展開します。

### UnityでCesium for Unity読み込み
Unity Hubを起動します。
Projectsタブから、Openをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/b269e266-23ee-edf3-076a-e272011a9aed.png)

上でダウンロード&展開したフォルダを選択して、「Open」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/b8544861-63ec-7c56-3a9c-8f7635fd572d.png)

Cesium for UnityのサンプルはUnityのバージョン2021.3.10f1 で作成されたようです。
私の環境ではバージョン2021.3.10f1 以下のUnityしかインストールされていなかったので、Choose another Editor versionをクリックした後にInstall Editor versionをクリックして、バージョン2021.3.16f1のUnityをインストールしました。

バージョン2021.3.10f1以上であれば問題ないかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/a1ff0616-cd2f-c134-ff84-328a1900946c.png)

ProjectsのAssets -> Scenes -> 01_CesiumWorldを選択して、ドラッグ&ドロップでHierarchyに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/31ae466d-8952-c0db-957f-78887eefc0a5.png)

Cesium for Unityの案内文のような表示と、Cesium World Terrain、Cesium OSM Builidngsが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/fad252a0-5191-5821-2797-f390f7010763.png)


### 視点の設定
HierarchyからCesiumをクリックして、OriginのLongitude、Latitude、Heightで緯度経度高さを指定できるようです。
今回は東京駅付近に設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/d6b9abb4-da6b-0970-ae38-f1ff10cac53f.png)

### Cesium for UnityでPLATEAU建物データを表示
今回は、[PLATEAU公式の3D Tiles配信サービス](https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md)を使って、3D Tiles形式のPLATEAUの建物データを表示していきます。


HierarchyからCesium OSM Builidngsをクリックします。
Sourceから、以下を編集します。

- Tileset Source
    - 初期状態の「From Cesium Ion」から、「From Url」に変更します。
- URL
    - [PLATEAU公式の3D Tiles配信サービス](https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md)から、お好みのデータセットのtileset.jsonを指定します。
    - 今回は、千代田区のテクスチャ付きの建物データ（https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13101_chiyoda-ku/texture/tileset.json ）にしました。

表示できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/5ead742d-e41e-bf24-cdfd-895c256a10f7.png)


## おわりに
Unityで、馴染みのある3D Tiles形式のPLATEAUデータを簡単に表示できてびっくりしました。
ゲームエンジンの世界にGISが入っていくのもいいですね～

ちなみに、記事書いてる途中で編集が全部消えて絶望しましたが、めげずに書き直しました（涙目）
こまめにセーブを忘れるなよ！おじさんとの約束だ！

## 参考文献
https://cesium.com/platform/cesium-for-unity/

https://cesium.com/platform/

https://www.mlit.go.jp/plateau/learning/tpc03-1/

https://www.mlit.go.jp/plateau/learning/tpc03-2/

https://www.mlit.go.jp/plateau/learning/tpc01-2/

https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md



:::note info
明日は@nokonoko_1203 さんです！お楽しみにー
:::