Rilevare i piani utilizzando ARCore per Jetpack XR

ARCore per Jetpack XR può rilevare superfici piane nell'ambiente dell'utente e fornire informazioni su di esse, come posa, dimensioni e orientamento. In questo modo l'app può trovare superfici come tavoli su cui posizionare gli oggetti.

Crea una sessione ARCore per Jetpack XR

Accedere alle informazioni sul piano tramite una sessione ARCore per Jetpack XR. Consulta la sezione Comprendere il ciclo di vita di una sessione per ottenere un Session.

Configurare la sessione

Il rilevamento del piano non è attivato per impostazione predefinita nelle sessioni XR. Per attivare il monitoraggio dell'aereo, configura la sessione e imposta la modalità 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. */)
}

Recupera lo stato dei piani percepiti

ARCore per Jetpack XR fornisce lo stato dei piani tramite un StateFlow che emette lo stato dei piani. L'iscrizione agli aerei in una sessione invia una notifica alla tua app quando gli aerei vengono aggiunti, aggiornati o rimossi.

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

Un piano ha le seguenti proprietà:

  • label: una descrizione semantica di un determinato Plane. Potrebbe essere un WALL, FLOOR, CEILING o TABLE.
  • centerPose: la posa del centro del piano rilevato.
  • extents: le dimensioni del piano rilevato, in metri.
  • vertices: un elenco di vertici di un poligono convesso che approssima il piano.

Eseguire un test di collisione con gli aerei

Un test di hit è un metodo per calcolare l'intersezione di un raggio con gli oggetti monitorati dalla sessione. Un'applicazione comune di un test di hit è puntare a una tabella e posizionare un oggetto in quella posizione. L'esecuzione di un test di hit produce un elenco di oggetti hit. In altre parole, un test di hit non si ferma al primo oggetto colpito. Tuttavia, spesso potresti essere interessato solo al primo oggetto di un determinato tipo.

Per eseguire un test di riscontro, utilizza Interaction.hitTest() con un 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
}