Detectar planos usando o ARCore para o Jetpack XR

O ARCore para Jetpack XR pode detectar superfícies planas no ambiente do usuário e fornecer informações sobre elas, como pose, tamanho e orientação. Isso pode ajudar seu app a encontrar superfícies como mesas para colocar objetos.

Criar uma sessão do ARCore para o Jetpack XR

Acessar informações do plano por uma sessão do ARCore para o Jetpack XR. Consulte Entender o ciclo de vida de uma sessão para receber uma Session.

Configurar a sessão

A detecção de plano não está ativada por padrão nas sessões de XR. Para ativar o rastreamento de avião, configure a sessão:

val newConfig = session.config.copy(
    planeTracking = Config.PlaneTrackingMode.HorizontalAndVertical,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

Recuperar o estado das superfícies percebidas

O ARCore para Jetpack XR fornece o estado dos planos por meio de um StateFlow que emite o estado dos planos. A inscrição em planos em uma sessão notifica seu app quando os planos são adicionados, atualizados ou removidos.

Plane.subscribe(session).collect { planes ->
    // Planes have changed; update plane rendering
}

Um plano tem as seguintes propriedades:

  • label: uma descrição semântica de um determinado Plane. Pode ser um Wall, Floor, Ceiling ou Table.
  • centerPose: a pose do centro do plano detectado.
  • extents: as dimensões do plano detectado, em metros.
  • vertices: uma lista de vértices de um polígono convexo que se aproxima do plano.

Realizar um teste de hit em planos

Um teste de hit é um método de cálculo da interseção de um raio com objetos rastreados pela sessão. Uma aplicação comum de um teste de hit é apontar para uma tabela e colocar um objeto nesse local. A realização de um teste de hit resulta em uma lista de objetos de hit. Em outras palavras, um hit-test não para no primeiro objeto atingido. No entanto, muitas vezes você só tem interesse no primeiro objeto encontrado de um determinado tipo.

Para realizar um teste de hit, use Interaction.hitTest() com um Ray:

val results = androidx.xr.arcore.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
    val trackable = it.trackable
    trackable is Plane && trackable.state.value.label == Plane.Label.Table
}