【徹底解説】ARCore Geospatial Creatorについて

# 環境
MacOS13.0
Unity 2021.3.16f
ARCoreExtentions 1.37.0
ARFoundantion 4.2.8
Cesium 1.3.1

# はじめに
5月のGoogleIOでGeospatialAPIのアップデートが発表されました。
そのうちの一つのARCore Geospatial Creatorについて解説します。

# Geospatial Creatorとは？
EditorでGoogle Earthのようなものを表示してそれを参考にGeospatialAPIのAnchorを置ける機能です。

（画像は原宿付近）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/45f672d0-ed0b-e957-6b15-40aef69ec152.png)

# 導入方法
以下公式ドキュメントを参考に導入していきます。

https://developers.google.com/ar/geospatialcreator/unity/quickstart?hl=ja


## 必要なもの
- GeospatialAPIのAPIキー、もしくは認証情報
    - GeospatialAPIを使うために必要
- Google Maps Tiles APIのAPIキー
    - Google Earth的な表示の元データ（3DTile)を取得するためのAPIキー

- Cesium
    - Google Maps Tiles APIから取得した3DTileを表示するためのツール
    - PlateauViewのモデル表示に使われている
    
https://plateauview.mlit.go.jp/


### GeospatialAPIのAPIキーの取得について
OSによって手順が異なります。
- Androidの場合

https://developers.google.com/ar/develop/unity-arf/geospatial/enable-android?hl=ja

- iOSの場合

https://developers.google.com/ar/develop/unity-arf/geospatial/enable-ios?hl=ja

セキュリティの関係でAndroidの場合キーレス認証、iOSの場合トークン認証を推奨されますが、今回はサンプルを試したいだけなのでAPIKeyを使うことにします。
サンプルを試し終わったらAPIKeyを無効にすることをおすすめします。

APIKeyの取得は以下の記事が参考になります。

https://zenn.dev/tkada/articles/04b44474149130

取得を終えたらどこかにメモっておきましょう。

### Google Maps Tiles APIのAPIキーの取得について

1. GCPのプロジェクトを作ってある状態で以下のページにアクセスします
https://console.cloud.google.com/apis/library/tile.googleapis.com?hl=ja
2. 有効にするをクリックし、MapTilesAPIを有効にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/03262ef2-0b1e-f895-2e64-26cee1b02c8c.png)
3. しばらくまっているとAPIキーが表示されるのでこちらもメモっておきましょう
![貼り付けた画像_2023_06_15_13_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/534d8812-9d9b-450a-5816-8f13dec24cd3.png)



## GeospatialAPI導入手順
1. Unityのプロジェクトを作り、ARFoundationとARCoreExtensionsをパッケージマネージャーからインストールする
    - 詳しくは公式ドキュメントを参考にしてください
https://developers.google.com/ar/develop/unity-arf/getting-started-extensions?hl=ja

2. GeospatialのSampleをインポートしておく
![貼り付けた画像_2023_06_15_15_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/d0e58a93-be7d-0ff9-1cd4-1581f8c53ba9.png)
3. Cesiumをインストールする
    1. [リリースページ](https://github.com/CesiumGS/cesium-unity/releases/)からtgzをダウンロードし、パッケージマネージャーからインストールする
    2.  横着してgiturlからインストールをするとエラーが起きるので大人しくtgzからインストールすること
3. AR Plugin ManagementでARCore/ARKitを有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/44775421-b1ca-39e6-e17f-1d577de610ea.png)
4. AR Core Extensionsの設定画面で先程取得したAPIキーを入力する
![貼り付けた画像_2023_06_15_15_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/c01fc99a-4bc7-80e8-4f4d-ae55d2b60aab.png)
4. GeospatialとGeospatial Creatorにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/720340ff-d16c-d144-04b6-b915e44e4d25.png)
5. Sampleシーンを開いておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/4f15fd5e-d822-89ea-aec5-0982aeb47cb9.png)

以上でGeospatialAPIの導入ができました。

## Geospatial Creatorの導入

先程のGeospatialというシーンの中で作業をしていきます。
1. ヒエラルキーで右クリックメニューを出してから XR/ARGeospatialCreatorOriginを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/0637099b-a686-e379-6bb3-b58eb1105c23.png)
2. するとARGeospatialCreatorOriginコンポーネントが生成されるのでAddCesiumGeoreferenceConponentを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/443bc3d0-0cd0-f9bb-04b0-b8cb4f70f469.png)
3. その後APIキーを入力する場所が現れるのでメモをしておいたGoogleMapTilesAPIKeyを入力します
![貼り付けた画像_2023_06_15_15_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/a3c2b2b2-609d-53e9-c2b2-5994c9cfc033.png)
4. 入力が終わるとどこかの山が表示されます
        （緯度39.736401、経度-105.25737、高さ2250の地点らしいです。おおよそアメリカ大陸の真ん中辺り）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/40a7a372-73ff-9410-78a2-bcf816ef9b60.png)

# Geospatial Creatorの使い方

## 表示される場所の変え方
ARGeospatialCreatorOriginオブジェクトのCesiumGeoreferenceのOriginに緯度と経度と高さ（ここでの高さは楕円体高）を入力することによってARGeospatialCreatorOriginの原点がその地点に移動します。

例えば以下のように設定すると渋谷駅前が表示されます。
![貼り付けた画像_2023_06_15_15_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/5f7cbdce-0d22-386d-ab94-5e263a75827b.png)

基本的に、Geospatialでオブジェクトを生成したい位置の近くにOriginを持ってくることを推奨します。
あまりに離れすぎると（20kmあたり）誤差が大きくなるそうです。


## 楕円体高とは？
ジオイド高に標高を加えた高さです。その地点の標高とジオイド高は緯度と経度を入力すると計算できるサイトが存在するのでそちらを参考にすると良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/73545f54-c671-2d8f-8d81-12f461a6e83f.png)
※出典 国土地理院

https://www.gsi.go.jp/buturisokuchi/grageo_geoid.html

※参考
[ジオイド高計算サイト](https://vldb.gsi.go.jp/sokuchi/surveycalc/geoid/calcgh/calc_f.html)
[標高計算サイト](https://maps.gsi.go.jp/development/elevation.html)

## アンカーの置き方
1. 右クリックメニューからXR/ARGeospatialCreatorAnchorを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/b3848c48-c6ce-2263-1b3b-923528ce9daf.png)
2. アンカーのプレハブが生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/8917bc8c-0557-9d93-a6bf-3d3c7dc8df0e.png)
3. このアンカーを動かすことによって配置される場所を変えられる
    - 例えばスクランブル交差点にCubeを置きたい場合このようにアンカーの子にCubeを配置すると良いです
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/296c281e-691e-0177-8a5f-7403ff565b5b.png)

## アンカーについて
AltitudeTypeを変えることによって配置する方法を変えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/f5a74ee2-d93f-e41c-ade2-0f873c9ae442.png)

詳しくは公式ドキュメントにかかれていますが、基本的にはTerrainもしくはRooftopを使うのが良いと思います。

https://developers.google.com/ar/geospatialcreator/unity/quickstart?hl=ja#add_and_place_a_geospatial_creator_anchor

### AltitudeTypeについて
- Manual Altitude
WGS84座標系に基づいてアンカー特定の高さに配置します。
先程でてきた楕円体高の座標系であるため0mが標高0mとは限らないため試行錯誤が必要になります。
- Terrain 
指定した緯度経度に対して、地面にアンカーを配置します。
地面の高さはGeospatialAPIのTerrainAnchorを使用します。
例えば、スクランブル交差点の地面に張り付くように設置したい場合以下のようにAltitude Offsetを0にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408473/a47c7695-162e-bdfe-b051-a8a0bf8146c2.png)
この際、Editor上で地面よりも上に配置していても、AR実行時に先程設定した地面からの高さのOffsetの値が優先されます。

- Rooftop
Terrainと同じように、指定した緯度経度で建造物の上部に対するアンカーを配置します。



# まとめ
ARCore Geospatial CreatorとはGoogleEarthのような空間をUnityEditorで表示し、アンカーを置くことができる機能です。
これを使うことによって今まで3Dスキャンやグーグルマップと重ね合わせながら試行錯誤をしていたオブジェクトの配置がかなり楽になります。