🌐
ARCore GeoSpatial APIをUnityで動かすためのシーン構成
概要
-
ARCore GeoSpatioal APIを動作させるためにUnityのシーン上で最低限必要になる要素について説明します
- ARCore GeoSpatioal APIのサンプルはアンカーを置いたりする処理が含まれているため、別アプリを作る際は使用しないことがあります
- 今回はそれらの要素を取り除いた、緯度経度高度が分かる状態にする最低限の処理について説明します
-
本記事ではARCore GeoSpatial APIが使える状態にセットアップされていることを前提に説明します
- まだセットアップがお済みでない方は下記の記事を参考にセットアップをお願いします
https://zenn.dev/tkada/articles/04b44474149130
- まだセットアップがお済みでない方は下記の記事を参考にセットアップをお願いします
シーン構成
要素 | 説明 |
---|---|
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