Anker mit ARCore für Jetpack XR erstellen

Ein Anker beschreibt einen festen Standort und eine feste Ausrichtung in der realen Welt. Wenn Sie ein Objekt an einem Anker anhängen, wirkt es realistischer.

ARCore für Jetpack XR-Sitzung erstellen

Erstellen Sie Anker über eine ARCore-für-Jetpack XR-Sitzung. Weitere 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 Ankerspeicherung ist jedoch in XR-Sitzungen nicht standardmäßig aktiviert. Wenn Sie Anker speichern und laden möchten, konfigurieren Sie die Sitzung:

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

Inhalte an einem festen Ort im Raum verankern

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

Anker relativ zu einem Trackable erstellen

Ein Anker wird relativ zu einem Trackable erstellt, z. B. einem Plane. Dadurch folgt der Anker dem angehängten Trackable, wenn er sich durch den 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 eine 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

Wenn Sie ein Modell an diesem Ort rendern möchten, [erstellen Sie ein GltfModel][5] und legen Sie als übergeordnetes Element ein AnchorEntity fest.

AnchorEntity.create(session, anchor).apply {
    setParent(session.activitySpace)
    addChild(entity)
}

TrackingState

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

Anker während der Sitzungen beibehalten

Ein nicht persistenter Anker verschwindet, nachdem eine Sitzung beendet wurde. Wenn Sie einen Anker speichern, merkt sich Ihre App die Position dieses Ankers in den privaten App-Daten. Dieser Anker kann in einer nachfolgenden Sitzung abgerufen werden und ist an demselben Ort auf der Welt verankert.

Wenn Sie einen Anker dauerhaft speichern möchten, verwenden Sie anchor.persist(), wie hier gezeigt:

val uuid = anchor.persist()

Ihre App kann den Anker mithilfe von UUID in einer zukünftigen Sitzung 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 den Anker nicht mehr benötigen, rufen Sie unpersist() an. 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 gespeicherten Anker anfordern, die sich noch im Speicher Ihrer App befinden:

val uuids = Anchor.getPersistedAnchorUuids(session)