🌐

ARCore GeoSpatial APIをUnityで動かすためのシーン構成

2022/06/19に公開

概要

  • ARCore GeoSpatioal APIを動作させるためにUnityのシーン上で最低限必要になる要素について説明します

    • ARCore GeoSpatioal APIのサンプルはアンカーを置いたりする処理が含まれているため、別アプリを作る際は使用しないことがあります
    • 今回はそれらの要素を取り除いた、緯度経度高度が分かる状態にする最低限の処理について説明します
  • 本記事ではARCore GeoSpatial APIが使える状態にセットアップされていることを前提に説明します

シーン構成

要素 説明
AR Session Origin カメラのRootとなるオブジェクトです
GameObject->XRのメニューから作成します
AR Camera 外界を映すカメラになります。AR Session Originを作成すると自動作成されます
AR Session ARのライフサイクルを制御します。こちらもGameObject->XRのメニューから作成します
ARCore Extensions ARCore Extensionsを使用するために必要です。こちらもGameObject->XRのメニューから作成します
AR Earth Manager ARCore GeoSpatial APIを使用するために必要です。ARCore Extensionsと同オブジェクトにアタッチする必要があります

上記の要素に加えて、ステータス確認のためのCanvasとTextを追加しています

ARCore Extensionsには下記の参照が必要です
それぞれのオブジェクトをアタッチしてください
Camera Config Filterは参照なしでも動作します

動作確認用スクリプト

動作確認のため下記のスクリプトを使用します
ローカライズが成功すると画面上に緯度・経度・高度などの情報が表示されます
このスクリプトを任意のオブジェクトにアタッチし、AREarthManager,ARCoreExtensions,Textオブジェクトの参照を持たせます

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
using Google.XR.ARCoreExtensions;

public class MyGeoSpatial : MonoBehaviour
{
    [Header("AR Components")]

    /// <summary>
    /// The AREarthManager used in the sample.
    /// </summary>
    public AREarthManager EarthManager;

    /// <summary>
    /// The ARCoreExtensions used in the sample.
    /// </summary>
    public ARCoreExtensions ARCoreExtensions;

    [SerializeField] Text infoText;

    // Update is called once per frame
    void Update()
    {
        var featureSupport = EarthManager.IsGeospatialModeSupported(GeospatialMode.Enabled);
        switch (featureSupport)
        {
            case FeatureSupported.Unknown:
                this.infoText.text = "FeatureSupported UnKnown";
                return;
            case FeatureSupported.Unsupported:
                this.infoText.text = "Geospatial API is not supported by this devices.";
                return;
            case FeatureSupported.Supported:
                if (ARCoreExtensions.ARCoreExtensionsConfig.GeospatialMode ==
                    GeospatialMode.Disabled)
                {
                    Debug.Log("Geospatial sample switched to GeospatialMode.Enabled.");
                    ARCoreExtensions.ARCoreExtensionsConfig.GeospatialMode =
                        GeospatialMode.Enabled;
                    return;
                }

                break;
        }

        var earthTrackingState = EarthManager.EarthTrackingState;
        var pose = earthTrackingState == TrackingState.Tracking ?
            EarthManager.CameraGeospatialPose : new GeospatialPose();
        if (earthTrackingState == TrackingState.Tracking)
        {
            this.infoText.text = string.Format(
            "Latitude/Longitude: {1}°, {2}°{0}" +
            "Horizontal Accuracy: {3}m{0}" +
            "Altitude: {4}m{0}" +
            "Vertical Accuracy: {5}m{0}" +
            "Heading: {6}°{0}" +
            "Heading Accuracy: {7}°",
            System.Environment.NewLine,
            pose.Latitude.ToString("F6"),
            pose.Longitude.ToString("F6"),
            pose.HorizontalAccuracy.ToString("F6"),
            pose.Altitude.ToString("F2"),
            pose.VerticalAccuracy.ToString("F2"),
            pose.Heading.ToString("F1"),
            pose.HeadingAccuracy.ToString("F1"));
        }
        else
        {
            this.infoText.text = "GEOSPATIAL POSE: not tracking";
        }
    }
}

ビルド後、ローカライズが成功すると下記のように情報が表示されます

Discussion