Crea anclas con ARCore para Jetpack XR

Un objeto Anchor describe una ubicación y orientación fijas en el mundo real. Adjuntar un objeto a un anclaje ayuda a que los objetos parezcan colocados de forma realista en el mundo real.

Crea una sesión de ARCore para Jetpack XR

Crea anclajes a través de una sesión de ARCore para Jetpack XR. Consulta Cómo comprender el ciclo de vida de una sesión para obtener un Session.

Configura la sesión

No es necesario configurar la sesión para crear y cargar anclajes. Sin embargo, la persistencia de anclajes no está habilitada de forma predeterminada en las sesiones de XR. Para conservar y cargar anclajes desde el almacenamiento local, configura la sesión y establece el modo AnchorPersistenceMode.LOCAL:

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

Ancla el contenido a una ubicación fija en el espacio

Se crea un ancla con un Pose, que se puede interpretar en relación con un Trackable existente o no.

Crea un ancla relativa a un objeto Trackable

Cuando se crea un ancla en relación con un Trackable, como un Plane, lo que hace que el ancla siga al Trackable adjunto cuando se mueve por el espacio.

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

Crea un ancla sin un objeto Trackable

Para crear un ancla que no esté unida a un Trackable, haz lo siguiente:

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

Cómo adjuntar una entidad a un anclaje

Para renderizar un modelo en esta ubicación, crea un GltfModel y establece su elemento superior en un AnchorEntity.

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

Información sobre TrackingState

Cada Trackable tiene un TrackingState que se debe verificar antes de usarlo. Un Trackable que tiene un TrackableState de Tracking tiene su Pose actualizado de forma activa por el sistema. Un Trackable que es Paused puede convertirse en Tracking en el futuro, mientras que uno que es Stopped nunca se convertirá en Tracking.

Cómo conservar un ancla en todas las sesiones

Un ancla que no se persiste desaparece después de que se destruye una sesión. Cuando persiste un ancla, tu app recuerda la posición de ese ancla en sus datos privados. Esta ancla se puede recuperar en una sesión posterior y se ancla en la misma ubicación del mundo.

Para conservar una ancla, usa Anchor.persist() como se muestra aquí:

val uuid = anchor.persist()

Tu app puede recuperar el ancla con UUID en una sesión futura:

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

Cuando ya no necesites un ancla, llama a unpersist(). Esto quita el anclaje del almacenamiento de tu app y hace que el UUID determinado no se pueda recuperar para las llamadas a Anchor.load().

Anchor.unpersist(session, uuid)

Tu app también puede solicitar una lista de todos los anclajes que se hayan conservado y que aún estén presentes en el almacenamiento de la app:

val uuids = Anchor.getPersistedAnchorUuids(session)