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 posição, 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 Jetpack XR

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

Configurar a sessão

A detecção de planos não está ativada por padrão nas sessões de RV/RA. Para ativar o rastreamento de planos, configure a sessão e defina o modo PlaneTrackingMode.HORIZONTAL_AND_VERTICAL:

val newConfig = session.config.copy(
    planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* A different unhandled exception was thrown. */)
}

Recuperar o estado dos planos percebidos

O ARCore para Jetpack XR fornece o estado dos planos por um StateFlow que emite o estado dos planos. Ao assinar planos em uma sessão, seu app recebe uma notificação quando 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 postura 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 calcular a interseção de um raio com objetos rastreados pela sessão. Uma aplicação comum de um teste de hit é apontar para uma mesa e colocar um objeto nesse local. A realização de um teste de hit resulta em uma lista de objetos atingidos. Em outras palavras, um teste de ocorrência não para no primeiro objeto atingido. No entanto, muitas vezes, você pode ter interesse apenas no primeiro acerto de objeto 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
}