Wykrywanie płaszczyzn za pomocą ARCore w Jetpack XR

ARCore dla Jetpacka XR może wykrywać płaskie powierzchnie w otoczeniu użytkownika i przekazywać informacje o takich właściwościach, jak ich pozycja, rozmiar i orientacja. Pomoże to aplikacji znaleźć powierzchnie, na których można umieszczać obiekty, np. stoły.

Tworzenie sesji ARCore na potrzeby Jetpack XR

Dostęp do informacji o samolocie w ramach sesji ARCore for Jetpack XR. Aby uzyskać Session, zapoznaj się z artykułem Omówienie cyklu życia sesji.

Konfigurowanie sesji

Wykrywanie samolotów jest domyślnie wyłączone w sesjach XR. Aby włączyć śledzenie w samolocie, skonfiguruj sesję:

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! */)
}

Pobieranie stanu wykrytych samolotów

ARCore dla Jetpack XR udostępnia stan samolotów za pomocą StateFlow, który emituje stan samolotów. Subskrypcja samolotów w sesji powiadamia aplikację o dodanych, zaktualizowanych i usuniętych samolotach.

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

Samolot ma te właściwości:

  • label: semantyczne opisy danego Plane. Może to być Wall, Floor, Ceiling lub Table.
  • centerPose: pozycja środka wykrytej płaszczyzny.
  • extents: wymiary wykrytej płaszczyzny w metrach.
  • vertices: lista wierzchołków wypukłego wielokąta, który przybliża się do płaszczyzny.

Przeprowadź test kolizji samolotów

Test kolizji to metoda obliczania przecięcia promienia z obiektmi śledzonymi przez sesję. Testowanie kolizji jest często wykorzystywane do wskazywania tabeli i umieszczania w niej obiektu. Przeprowadzenie testu uderzenia powoduje wyświetlenie listy obiektów, które zostały uderzone. Inaczej mówiąc, test kolizji nie zatrzymuje się na pierwszym obiekcie. Często jednak interesuje Cię tylko pierwszy trafiony obiekt danego typu.

Aby przeprowadzić test trafień, użyj Interaction.hitTest()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
}