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 una orientación en el mundo real. Si conectas un objeto a un ancla, los objetos aparecerán colocados de forma realista en el mundo real y ayudarás a que tu app ahorre energía, ya que no tendrá que ejecutar la lógica en cada fotograma.

Accede a una sesión

Crea anclas a través de un objeto de ARCore para Jetpack XR Session. Si mejoras la IU espacial con Jetpack Compose para realidad extendida, accede a una sesión desde Jetpack Compose para realidad extendida. 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 = 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. */)
}

Ancla contenido a una ubicación en el espacio

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

Crea un ancla en relación con un objeto Anchorable

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

val anchor = plane.createAnchor(pose)

Crea un ancla fija en el mundo

Para crear un ancla fija en el mundo, no la conectes a un objeto Anchorable. Usa este tipo de ancla solo para los puntos que flotan en el espacio, ya que la estimación de la sesión de dónde se encuentran los objetos inamovibles cambia con el tiempo:

val anchor = Anchor.create(session, pose)

Conecta una entidad a un ancla

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

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

Comprende TrackingState

Cada objeto Trackable tiene un objeto TrackingState que se debe verificar antes de usarse. Un Trackable que tiene un TrackableState de Tracking tiene su Pose actualizado de forma activa por el sistema. Un objeto 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. Si conservas un ancla, tu app recuerda la posición de esa ancla en sus datos de app privados. 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)