Wykrywanie płaszczyzn za pomocą ARCore w Jetpack XR

ARCore w Jetpack XR może wykrywać płaskie powierzchnie w otoczeniu użytkownika i dostarczać o nich informacje, takie jak ich położenie, rozmiar i orientacja. Może to pomóc aplikacji w znalezieniu powierzchni, np. stołów, na których można umieścić obiekty.

Tworzenie sesji ARCore w Jetpack XR

Dostęp do informacji o płaszczyznach w sesji ARCore w Jetpacku XR. Aby uzyskać Session, przeczytaj artykuł Cykl życia sesji.

Konfigurowanie sesji

Wykrywanie płaszczyzn nie jest domyślnie włączone w sesjach XR. Aby włączyć śledzenie samolotu, skonfiguruj sesję i ustaw tryb 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. */)
}

android.permission.SCENE_UNDERSTANDING_COARSE

Pobieranie stanu wykrytych płaszczyzn

ARCore w Jetpack XR udostępnia stan płaszczyzn za pomocą StateFlow, który emituje stan płaszczyzn. Subskrybowanie płaszczyzn w sesji powiadamia aplikację o dodaniu, zaktualizowaniu lub usunięciu płaszczyzn.

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

Płaszczyzna ma te właściwości:

Przeprowadzanie testu trafienia na płaszczyznach

Test trafienia to metoda obliczania przecięcia promienia z obiektami śledzonymi przez sesję. Częstym zastosowaniem testu trafienia jest wskazanie stołu i umieszczenie na nim obiektu. Przeprowadzenie testu trafienia powoduje wyświetlenie listy trafionych obiektów. Innymi słowy, test trafienia nie zatrzymuje się na pierwszym trafionym obiekcie. Często jednak interesuje Cię tylko pierwszy obiekt danego typu.

Aby przeprowadzić test trafienia, użyj funkcji Interaction.hitTest() z parametrem 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
}