Trabalhar com posturas geoespaciais

Dispositivos XR relevantes
Estas orientações ajudam você a criar experiências para esses tipos de dispositivos XR.
Óculos XR com fio
Óculos com áudio e
tela

Um GeospatialPose descreve uma posição no espaço em relação à Terra. Ela é composta pelos seguintes componentes:

  • Latitude e longitude, especificadas em graus, conforme definido pela especificação WGS84.
  • Altitude, que é especificada em metros acima do elipsoide WGS84 ou aproximadamente equivalente a metros acima do nível do mar.
  • Orientação, que aproxima a direção para onde a pose está voltada no sistema de coordenadas EUS. O sistema de coordenadas EUS tem X+ apontando para o leste, Y+ apontando para cima e Z+ apontando para o sul.

A API Geospatial fornece acesso à pose geoespacial do dispositivo e oferece conversões entre poses geoespaciais e poses locais do dispositivo.

Pré-requisitos

Para receber e converter poses geoespaciais, seu app precisa estar configurado para usar a API Geospatial. As poses geoespaciais só podem ser obtidas quando a API Geospatial tem um estado RUNNING.

Converter uma pose local do dispositivo em uma pose geoespacial

Uma Pose local do dispositivo pode ser convertida em uma GeospatialPose, por exemplo, para determinar a posição do dispositivo do usuário em relação à Terra. Isso pode ajudar você:

  • Crie conteúdo de RA persistente, em que um objeto virtual colocado pelo usuário é ancorado com precisão em um local global para recuperação posterior.
  • Acione experiências baseadas em localização atualizando continuamente a posição do usuário em um mapa para permitir a navegação em tempo real ou a jogabilidade com fronteira geográfica virtual.
  • Determinar o contexto real preciso do usuário para acionar a lógica do aplicativo relevante para o local.

O exemplo de código a seguir demonstra como converter um Pose em um GeospatialPose usando Geospatial.createGeospatialPoseFromPose().

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

Converter uma pose geoespacial em uma pose local do dispositivo

Também é possível converter um GeospatialPose em um Pose local do dispositivo. Essa transformação pega informações definidas por coordenadas do mundo real, como o local de um ponto de referência, um trajeto de navegação ou conteúdo de RA persistente, e as converte no espaço visual preciso do dispositivo do usuário.

O exemplo de código a seguir demonstra como usar Geospatial.createPoseFromGeospatialPose() para converter uma pose geoespacial em uma pose local do dispositivo.

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