Crea anclas con ARCore para Jetpack XR

Dispositivos de realidad extendida correspondientes
Esta guía te ayuda a crear experiencias para estos tipos de dispositivos de realidad extendida.
Visores de realidad extendida
Lentes de realidad extendida con cable

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

Accede a una sesión

Crea anclas a través de un ARCore para Jetpack XR Session. Si mejoras la IU espacial con Jetpack Compose para XR, accede a una sesión desde Jetpack Compose para XR. Si trabajas con entidades espacializadas de la biblioteca de Jetpack SceneCore, accede a una sesión desde Jetpack XR Runtime.

Configura la sesión

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

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

Ancla contenido a una ubicación fija en el espacio

Un ancla se crea con un Pose, que se puede interpretar en relación con un Anchorable existente o no. Un Anchorable es un Trackable al que se le pueden conectar anclas.

Crea un ancla en relación con un Anchorable

Cuando se crea un ancla en relación con un Anchorable, como un Plane, el ancla sigue al Anchorable conectado cuando se mueve por el espacio.

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

Crea un ancla sin un Anchorable

Para crear un ancla que no esté conectada a un Anchorable, haz lo siguiente:

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

Conecta una entidad a un ancla

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)
}

Comprende TrackingState

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

Conserva un ancla en todas las sesiones

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

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

val uuid = anchor.persist()

Tu app puede recuperar el ancla con el 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 ancla 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 todas las anclas que se conservaron y que aún están presentes en el almacenamiento de tu app:

val uuids = Anchor.getPersistedAnchorUuids(session)