Anker mit ARCore für Jetpack XR erstellen

Ein Anker beschreibt einen festen Ort und eine feste Ausrichtung in der realen Welt. Wenn Sie ein Objekt an einen Anker anfügen, wird es realistisch in der realen Welt platziert.

ARCore für Jetpack XR-Sitzung erstellen

Anker über eine ARCore für Jetpack XR-Sitzung erstellen Informationen zum Abrufen einer Session finden Sie unter Lebenszyklus einer Sitzung.

Sitzung konfigurieren

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

val newConfig = session.config.copy(
    anchorPersistence = Config.AnchorPersistenceMode.LOCAL,
)
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. */)
}

Inhalte an einer festen Position im Raum verankern

Ein Anker wird mit einem Pose erstellt, das relativ zu einem vorhandenen Trackable interpretiert werden kann oder nicht.

Anker relativ zu einem Trackable erstellen

Wenn ein Anker relativ zu einem Trackable erstellt wird, z. B. einem Plane, folgt der Anker dem angehängten Trackable, wenn es sich im Raum bewegt.

when (val result = trackable.createAnchor(pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

Anker ohne Trackable erstellen

So erstellen Sie einen Anker, der nicht an ein Trackable angehängt ist:

when (val result = Anchor.create(session, pose)) {
    is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ }
    else -> { /* handle failure */ }
}

Entität an einen Anker anhängen

Um ein Modell an diesem Ort zu rendern, erstellen Sie ein GltfModel und legen Sie das übergeordnete Element auf ein AnchorEntity fest.

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

TrackingState

Jede Trackable hat eine TrackingState, die vor der Verwendung geprüft werden sollte. Bei einem Trackable mit einem TrackableState von Tracking wird das Pose aktiv vom System aktualisiert. Ein Trackable, das Paused ist, kann in Zukunft Tracking werden, während ein Trackable, das Stopped ist, nie Tracking werden kann.

Anker über Sitzungen hinweg 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 späteren Sitzung abgerufen werden und befindet sich am selben Ort.

Wenn Sie einen Anker beibehalten möchten, verwenden Sie Anchor.persist(), wie hier gezeigt:

val uuid = anchor.persist()

Ihre App kann den Anker in einer zukünftigen Sitzung mit 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 durch Aufrufe von Anchor.load() abgerufen werden.

Anchor.unpersist(session, uuid)

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

val uuids = Anchor.getPersistedAnchorUuids(session)