地理空間ポーズを使用する

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
有線 XR グラス
オーディオ&
ディスプレイ グラス

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
    }
}