Unityの座標をGeospatial APIを使って緯度経度に変換する方法
はじめに
UnityでARアプリケーションを開発する際、リアルワールドの位置情報を取り扱うことがしばしばあります。GoogleのARCore Extensions for AR Foundationを使うことで、Unity内のオブジェクト位置を現実世界の地理空間座標(緯度、経度、高度)に変換することが可能です。この機能はAREarthManagerクラスのConvertメソッドにあります。
Convertメソッドの使い方
Convertメソッドは、Unityの座標空間から地理空間座標への変換、またはその逆の変換を行うことができます。これにより、Unity内で設計したオブジェクトを実際の地理的位置に基づいて配置したり、地理空間の情報をUnityの世界に取り込むことが可能になります。
[SerializeField] private AREarthManager arEarthManager;
// Unityのポーズから地理空間ポーズへの変換
GeospatialPose geospatialPose = arEarthManager.Convert(unityPose);
// 地理空間ポーズからUnityのポーズへの逆変換
Pose unityPose = arEarthManager.Convert(geospatialPose);
例えば、今回私はカメラより1.5m程前にARオブジェクトを設置したかったのですが、Unityのカメラの前の座標を緯度経度に変換する場合は以下のような記述になります。(変換後、アンカーに追加)
// カメラの1.7m前方にオブジェクトの位置を設定
var cameraTransform = _Camera.transform;
var forwardPosition = cameraTransform.position + cameraTransform.forward * _Distance;
var forwardPose = new Pose(forwardPosition, cameraTransform.rotation);
// forwardPoseを地理空間座標に変換
GeospatialPose geospatialPose = arEarthManager.Convert(forwardPose);
// GeospatialPoseの緯度、経度、高度をfloatにキャスト
var anchorPose = new Pose(
new Vector3((float)geospatialPose.Latitude, (float)geospatialPose.Altitude, (float)geospatialPose.Longitude),
Quaternion.Euler(0, (float)geospatialPose.Heading, 0)
);
var anchor = arAnchorManager.AddAnchor(anchorPose);
またカメラの位置の緯度経度は以下のように取得可能です。
var pose = arEarthManager.CameraGeospatialPose;
AREarthManagerの中身
AREarthManagerクラスは以下の主な機能を提供しています。(一応参考)
地球の状態と追跡状態の取得: EarthStateとEarthTrackingStateプロパティは、最新のフレームにおける地球の状態と追跡状態を提供します。これにより、アプリケーションは地理空間情報の取得が可能かどうかを判断できます。
カメラの地理空間ポーズの取得: CameraGeospatialPoseプロパティは、デバイスのカメラに関する地理空間ポーズを提供します。このポーズは、デバイスのカメラが地球上のどこに位置しているか、どの方向を向いているかを示します。
VPSの利用可能性の確認: CheckVpsAvailabilityAsyncメソッドは、指定された地点でのVisual Positioning System (VPS) の利用可能性を非同期的に確認します。VPSの利用可能性は、地理空間のローカライゼーションと追跡精度の向上に役立ちます。
地理空間ポーズとローカルポーズの相互変換: Convertメソッドは、ローカルポーズを地理空間ポーズに、またはその逆に変換します。これにより、Unityの3D空間内の位置や方向を地球上の実際の位置や方向に関連付けることができます。
まとめ
AREarthManagerのConvertメソッドを利用することで、Unity開発者は地理空間データを容易に扱い、現実世界とデジタルコンテンツの間のギャップを埋めることができます。これにより、位置情報を活用した没入感のあるAR体験の創出が可能になります。