Ebenen mit ARCore für Jetpack XR erkennen

Mit ARCore für Jetpack XR können ebene Oberflächen in der Umgebung des Nutzers erkannt und Informationen zu ihnen bereitgestellt werden, z. B. ihre Position, Größe und Ausrichtung. So kann Ihre App Oberflächen wie Tische finden, auf denen Objekte platziert werden können.

ARCore für Jetpack XR-Sitzung erstellen

Über eine ARCore for Jetpack XR-Sitzung auf Ebeneninformationen zugreifen Informationen zum Abrufen einer Session finden Sie unter Lebenszyklus einer Sitzung.

Sitzung konfigurieren

Die Erkennung von Ebenen ist in XR-Sitzungen nicht standardmäßig aktiviert. So aktivieren Sie die Ebenenverfolgung: Konfigurieren Sie die Sitzung und legen Sie den Modus PlaneTrackingMode.HORIZONTAL_AND_VERTICAL fest:

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

Status der erkannten Ebenen abrufen

ARCore für Jetpack XR stellt den Status von Ebenen über einen StateFlow bereit, der den Status von Ebenen ausgibt. Wenn Sie Ebenen in einer Sitzung abonnieren, wird Ihre App benachrichtigt, wenn Ebenen hinzugefügt, aktualisiert oder entfernt werden.

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

Eine Ebene hat die folgenden Eigenschaften:

  • label: eine semantische Beschreibung eines bestimmten Plane. Kann ein WALL, FLOOR, CEILING oder TABLE sein.
  • centerPose: Die Position des Mittelpunkts der erkannten Ebene.
  • extents: Die Abmessungen der erkannten Ebene in Metern.
  • vertices: Eine Liste von Eckpunkten eines konvexen Polygons, das die Ebene annähert.

Treffertest für Ebenen durchführen

Ein Treffertest ist eine Methode zum Berechnen der Schnittmenge eines Strahls mit Objekten, die von der Sitzung verfolgt werden. Ein häufiger Anwendungsfall für einen Treffertest ist, auf einen Tisch zu zeigen und ein Objekt an dieser Stelle zu platzieren. Wenn Sie einen Treffertest durchführen, erhalten Sie eine Liste von Trefferobjekten. Mit anderen Worten: Ein Treffertest wird nicht beim ersten getroffenen Objekt beendet. Oft sind Sie jedoch nur am ersten getroffenen Objekt eines bestimmten Typs interessiert.

Verwenden Sie zum Ausführen eines Treffertests Interaction.hitTest() mit einer 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
}