🌏

ARCore Geospatial API Terrain anchors(地形アンカー)のサンプルを見る

2022/08/20に公開

概要

2022/08/19 に ARCore Geospatial API の Terrain anchors(地形アンカー)が公開されました。

この Terrain anchors によって、今まではアンカーを作成する時に高さ情報が必要でしたが、高さ情報が必要なくなりました。高さは Terrain anchors の API を使用すると、緯度/経度から高さを自動的に入ります。

本記事ではこの Terrain anchors のサンプルを見てみようと思います。

実際に動かしたところ

Geospatial API とは、サンプルの環境構築方法

Unity で環境構築する方法が記事にありますので、こちらを参考にしてください。
こちらと同じ方法で、Terrain anchors の環境構築が可能です。

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

環境

Unity 2021.3.4f1
AR Fundation 4.2.3
ARCore XR Plugin 4.2.3
ARKit XR Plugin 4.2.3
ARCore Extensions 1.33.0

ドキュメント

公式ドキュメント

https://developers.google.com/ar/develop/unity-arf/geospatial/terrain-anchors

GitHub Release

ARCore Extensions for AR Foundation v1.33.0

https://github.com/google-ar/arcore-unity-extensions/releases/tag/v1.33.0

Terrain anchors の API

ResolveAnchorOnTerrain

https://developers.google.com/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARAnchorManagerExtensions#resolveanchoronterrain

Terrain anchorsの使い方

GeospatialController.cs の PlaceGeospatialAnchor() で、Terrain anchors を使用しています。
ここ以外は他と変更なく Terrain anchors を利用できます。つまりAnchorManager.AddAnchorAnchorManager.ResolveAnchorOnTerrainに変更するだけです。

        private ARGeospatialAnchor PlaceGeospatialAnchor(
            GeospatialAnchorHistory history, bool terrain = false)
        {
            Quaternion quaternion =
                Quaternion.AngleAxis(180f - (float)history.Heading, Vector3.up);
            var anchor = terrain ?
                AnchorManager.ResolveAnchorOnTerrain(
                    history.Latitude, history.Longitude, 0, quaternion) :
                AnchorManager.AddAnchor(
                    history.Latitude, history.Longitude, history.Altitude, quaternion);
            if (anchor != null)
            {
                GameObject anchorGO = terrain ?
                    Instantiate(TerrainPrefab, anchor.transform) :
                    Instantiate(GeospatialPrefab, anchor.transform);
                anchor.gameObject.SetActive(!terrain);
                _anchorObjects.Add(anchor.gameObject);
            }

            return anchor;
        }

実際には、AnchorManager.ResolveAnchorOnTerrain(history.Latitude, history.Longitude, 0, quaternion)の部分で、緯度/経度を引数に渡すと緯度/経度に応じた高さが設定されたアンカーを作成することができます。

以前の API では、AnchorManager.AddAnchor(history.Latitude, history.Longitude, history.Altitude, quaternion);のようにAltitudeを指定する必要がありましたが、ResolveAnchorOnTerrainにはありません。
代わりにあるのはaltitudeAboveTerrainで、緯度/経度に応じた高さからの相対値を指定します。地面/床より 1m 高い位置にアンカーを設置したい場合は 1 を指定します。サンプルは 0 ですので地面/床の高さにアンカーが設置されます。

サンプルアプリの動作

実際に動かすと下図のような画面が表示されます。
SET TERRAIN ANCHORSをタップすると、Terrain anchors を作成できます。SET ANCHORをタップすると、今までのアンカー(スマホの高さ)を作成できます。

まとめ

  • 国土地理院などから高さを取得する必要が無くなったのでかなり実装は楽になります。
  • 今までの実装とほとんど変更なく Terrain anchors を利用できるのでかなり移行も楽です。

Discussion