Anker mit ARCore für Jetpack XR erstellen

XR‑Geräte, für die der Leitfaden gilt
Dieser Leitfaden hilft Ihnen dabei, Erlebnisse für die folgenden Arten von XR-Geräten zu entwickeln.
XR‑Headsets
Kabelgebundene XR‑Brillen

Ein Anker beschreibt einen Ort und eine Ausrichtung in der realen Welt. Wenn Sie ein Objekt an einen Anker anhängen, wird es realistisch in der realen Welt platziert. Außerdem kann Ihre App dadurch Strom sparen, da die Logik nicht bei jedem Frame ausgeführt werden muss.

Auf eine Sitzung zugreifen

Erstellen Sie Anker über eine ARCore for Jetpack XR Session. Wenn Sie die räumliche UI mit Jetpack Compose for XR verbessern, greifen Sie über Jetpack Compose for XR auf eine Sitzung zu. Wenn Sie mit räumlichen Entitäten aus der Jetpack SceneCore-Bibliothek arbeiten, greifen Sie über Jetpack XR Runtime auf eine Sitzung zu.

Sitzung konfigurieren

Zum Erstellen und Laden von Ankern muss die Sitzung nicht konfiguriert werden. Die Ankerpersistenz ist jedoch in XR‑Sitzungen standardmäßig nicht aktiviert. Wenn Sie Anker im lokalen Speicher beibehalten und laden möchten, konfigurieren Sie die Sitzung und legen Sie den AnchorPersistenceMode.LOCAL Modus fest:

val newConfig = Config.Builder(session.config)
    .setAnchorPersistence(AnchorPersistenceMode.LOCAL)
    .build()
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

Inhalte an einem Ort im Raum verankern

Ein Anker wird mit einem Pose erstellt, das relativ zu einem vorhandenen Anchorable interpretiert oder in der Welt fixiert werden kann. Ein Anchorable ist ein Trackable, an das Anker angehängt werden können.

Anker relativ zu einem Anchorable erstellen

Wenn ein Anker relativ zu einem Anchorable wie einer Plane erstellt wird, folgt der Anker dem angehängten Anchorable, wenn es sich im Raum bewegt.

val anchor = plane.createAnchor(pose)

Anker in der Welt fixieren

Wenn Sie einen Anker erstellen möchten, der in der Welt fixiert ist, hängen Sie ihn nicht an ein Anchorable an. Verwenden Sie diesen Ankertyp nur für Punkte, die im Raum schweben, da sich die Schätzung der Sitzung, wo sich unbewegliche Objekte befinden, im Laufe der Zeit ändert:

val anchor = Anchor.create(session, pose)

Entität an einen Anker anhängen

Wenn Sie ein Modell an diesem Ort rendern möchten, erstellen Sie ein GltfModel und legen Sie das übergeordnete Element auf AnchorSpace fest.

AnchorSpace.create(session, anchor).apply {
    parent = session.scene.activitySpace
    addChild(entity)
}

TrackingState

Jedes Trackable hat einen TrackingState, der vor der Verwendung überprüft werden sollte. Bei einem Trackable mit dem TrackableState Tracking wird die Pose aktiv vom System aktualisiert. Ein Trackable mit dem Status Paused kann in Zukunft den Status Tracking erhalten, während ein mit dem Status Stopped niemals den Status Tracking erhalten wird.

Anker für alle Sitzungen beibehalten

Ein Anker, der nicht beibehalten wird, verschwindet, nachdem eine Sitzung beendet wurde. Wenn Sie einen Anker beibehalten, speichert Ihre App die Position des Ankers in ihren privaten App-Daten. Dieser Anker kann in einer nachfolgenden Sitzung abgerufen und an derselben Stelle in der Welt verankert werden.

Verwenden Sie Anchor.persist(), um einen Anker beizubehalten, wie hier gezeigt:

val uuid = anchor.persist()

Ihre App kann den Anker in einer zukünftigen Sitzung mit der UUID abrufen:

when (val result = Anchor.load(session, uuid)) {
    is AnchorCreateSuccess -> {
        // Loading was successful. The anchor is stored in result.anchor.
    }
    else -> {
        // handle failure
    }
}

Wenn Sie einen Anker nicht mehr benötigen, rufen Sie unpersist() auf. Dadurch wird der Anker aus dem Speicher Ihrer App entfernt und die angegebene UUID kann nicht mehr für Aufrufe von Anchor.load() abgerufen werden.

Anchor.unpersist(session, uuid)

Ihre App kann auch eine Liste aller beibehaltenen Anker anfordern, die noch im Speicher Ihrer App vorhanden sind:

val uuids = Anchor.getPersistedAnchorUuids(session)