無限PLATEAUを更新しました、使ってみてください

# 無限PLATEAUとは？

[無限PLATEAU](https://github.com/oho-sugu/InfinityPLATEAU)は、筆者が作成した一連のシステムです。

PLATEAUの3Dモデルのうち、一番詳細度の低いLOD0に属性情報から高さを与えた3Dモデルを、あらかじめタイルに区切ってDraco形式で保存したものをWebでアクセスできるようにサーバーに配置しておきます。

これを、Unityのランタイムで緯度経度と範囲を指定すると、その範囲のモデルをダウンロードして表示してくれる仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/0d553faf-5db8-5c90-e623-b4507bbe22f6.png)

簡易的ですが、PLATEAU SDKを使うよりも、手軽に軽量に3Dモデルを表示できます。また、オンラインであればデータを持っておかなくてもよい点は利点です。

以前、Geospatial APIと組み合わせて使う事例を公開していたのですが、今回、Unity Package Managerで導入できる形に整理し、直接緯度経度の指定によりモデルがロードされるようにしました。

また、データの配置をCloudflareに移したので、無料分でそれなりのアクセスがさばけるようになりました。そのため、使いたい人がいたら試しに使ってくださいというステータスで公開します。
（そしてついでにPLATEAUのアドベントカレンダーを埋めます！）

※注意
とはいえ、個人が運用しているものなので、過大な負荷になった場合アクセスを遮断することがあります。あくまでも試用レベルにとどめ、仮に商用や個人でも大規模な利用になる場合には、サーバーなどを自前で用意していただくようお願いいたします。その場合、お手伝いはできます。

## 使い方

### 導入

まず、Unityプロジェクトを用意したら、[DracoUnity](https://github.com/atteneder/DracoUnity)のパッケージを導入します。

UnityのPackage Managerを開き、左上の「＋」ボタンから、「Add Package from git URL」を選択し、表示される入力欄に`https://github.com/atteneder/DracoUnity.git`を入力して「Add」ボタンを押し、パッケージを導入してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/6af13d5b-2769-6905-3300-67ca6d581e60.png)

つぎに、同様に無限PLATEAUを導入します。
URLとして、`https://github.com/oho-sugu/InfinityPLATEAU.git?path=/Packages/tech.ortv.infinityplateau`を入力してパッケージを導入してください。

これでプロジェクトへの導入は完了です。

### シーンでの使い方

プロジェクトビューの`Packages/MugenPLATEAU/Runtime/Prefabs`にある、`PLATEAUManager`プレファブをシーンにおいてください。このとき、なるべく原点座標に回転なしで置いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/5a044b9d-59e0-847f-a005-3a49a8bf4f69.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/aadf403c-4329-8b4d-5bb2-06273c10ff23.png)

インスペクターで`PLATEAUManager`の`Lat`,`Lon`に、中心にしたい緯度経度を度で入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/cdb0586d-57e3-fa78-fcc0-db82df924759.png)

この中心座標が含まれるタイルの中心が3Dモデルの中心になります。
また、`Material`には、ロードした3Dモデルに割り当てるマテリアルを、`Range`には、ロードする範囲を入力します。`Range`は、Range*2+1を縦横とする(Range*2+1)^2のタイルをロードするので、大きな値を設定しないようにしてください。（せいぜい3くらいが最大かと思います。）

この状態で実行するとモデルがロードされます。

初期設定では、東京駅周辺のデータがロードされます。

### アンカーの使い方

簡易的ですが、無限PLATEAUのロードした3Dモデル内の任意の位置に緯度経度を指定してオブジェクトを配置する仕組みがあります。

`PLATEAUManager`を開くと、`Place`の下に2つのオブジェクトがあらかじめ配置されていると思います。これらは、削除しても動作に支障はありませんが、Anchorの例として置いてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/7bfd2457-fb61-2d01-1760-c1301bbc6d29.png)

図のように、GameObjectにPLATEAUAnchorをアタッチして、緯度経度と高さを指定すると、PLATEAUManagerの管理する3Dモデルの指定した緯度経度に対応する位置にオブジェクトを移動してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/73d2ec8a-c292-9ab7-b9fb-2f65c9705037.png)

注意点として、GameObjectのTransformのLocalpositionに位置を設定するので、PLATEAUManagerの原点からヒエラルキー上で移動していないことが必要になります。また、高さは楕円体高での指定になります。

現時点での無限PLATEAUは以上のようなものになります。

# 今後

詳細度の高いモデルやテクスチャ付きのモデルが欲しいとか、
遠方の表示用に簡略化・軽量化したモデルがあって、自動で選択してくれるとか、
ローカルにキャッシュする機能とか、もっとロバストに使いやすくだとか…

考え始めると色々必要なものがありますが、一旦こんなこともできるよという参考実装ということでご笑覧ください。

ARのオクルージョン用途などには、ある程度使えるかなと思うので、試しに使ってみてください。

# 無限PLATEAUのデータの作り方

[ホロらぼん Vol.01](https://techbookfest.org/product/rvNpgkshrmF5HBS3SCADFQ?productVariantID=ahGnX5au8ab7Y26sdbjtYV)の1章で、どのように3Dデータを作成したかの詳細を書いています。
無料で入手できますので、よろしければ参照ください。