GeospatialPose は、地球を基準とした空間内の位置を表します。これは次のコンポーネントで構成されています。
- 緯度と経度。WGS84 仕様で定義されている度数で指定します。
- 高度。WGS84 楕円体からの高さ(メートル単位)で指定します。これは、海抜(メートル単位)とほぼ同じです。
- 向き。EUS 座標系でポーズが向いている方向を近似します。EUS 座標系では、X+ が東、Y+ が上、Z+ が南を指します。
Geospatial API を使用すると、デバイスの Geospatial ポーズにアクセスし、Geospatial ポーズとデバイスローカル ポーズ間の変換を行うことができます。
前提条件
Geospatial のポーズを取得して変換するには、アプリが Geospatial API を使用するように設定されている必要があります。Geospatial ポーズは、Geospatial API の状態が RUNNING の場合にのみ取得できます。
デバイスローカルのポーズを地理空間ポーズに変換する
デバイスローカルの Pose は、たとえば地球に対するユーザーのデバイスの位置を特定するために、GeospatialPose に変換できます。次のような使い方ができます。
- 永続的な AR コンテンツを作成します。ユーザーが配置した仮想オブジェクトは、後で取得できるようにグローバルな場所に正確にアンカーされます。
- 地図上のユーザーの位置を継続的に更新して、リアルタイムのナビゲーションやジオフェンス ゲームプレイを可能にすることで、位置情報ベースのエクスペリエンスをトリガーします。
- 位置情報に関連するアプリケーション ロジックをトリガーするために、ユーザーの正確な現実世界のコンテキストを特定する。
次のコードサンプルは、Geospatial.createGeospatialPoseFromPose() を使用して Pose を GeospatialPose に変換する方法を示しています。
val devicePose = ArDevice.getInstance(session).state.value.devicePose // Convert the device Pose into a GeospatialPose. when (val result = geospatial.createGeospatialPoseFromPose(devicePose)) { is CreateGeospatialPoseFromPoseSuccess -> { val geoPose = result.pose val lat = geoPose.latitude val lon = geoPose.longitude val alt = geoPose.altitude // Orientation is in the EUS (East-Up-South) coordinate system. val orientation = geoPose.eastUpSouthQuaternion } is CreateGeospatialPoseFromPoseNotTracking -> { // Geospatial is not currently tracking. } else -> { // A newer exception was added, but your app is using an old version of the library } }
Geospatial のポーズをデバイスローカルのポーズに変換する
GeospatialPose をデバイスローカルの Pose に変換することもできます。この変換では、ランドマークの位置、ナビゲーション パス、永続的な AR コンテンツなど、現実世界の座標で定義された情報が、ユーザーのデバイスの正確な視覚空間に変換されます。
次のコードサンプルは、Geospatial.createPoseFromGeospatialPose() を使用して Geospatial のポーズをデバイスローカルのポーズに変換する方法を示しています。
// Convert a GeospatialPose (lat/long/alt) back to a device-space Pose. when (val result = geospatial.createPoseFromGeospatialPose(geoPose)) { is CreatePoseFromGeospatialPoseSuccess -> { val devicePose: Pose = result.pose // devicePose is now ready to be used relative to the tracking origin. } is CreatePoseFromGeospatialPoseNotTracking -> { // Geospatial is not currently tracking. } is CreatePoseFromGeospatialPoseInternalError -> { // An internal error occurred. } else -> { // A newer exception was added, but your app is using an old version of the library } }