Créer des ancrages avec ARCore pour Jetpack XR

Appareils XR concernés
Ces conseils vous aident à créer des expériences pour ces types d'appareils XR.
Casques XR
Lunettes XR filaires

Une ancre décrit un emplacement et une orientation fixes dans le monde réel. Associer un objet à une ancre permet de le placer de manière réaliste dans le monde réel.

Accéder à une session

Créez des ancres via une ARCore pour Jetpack XR Session. Si vous améliorez l'interface utilisateur spatiale à l'aide de Jetpack Compose pour XR, accédez à une session à partir de Jetpack Compose pour XR. Si vous utilisez des entités spatialisées à partir de la bibliothèque Jetpack SceneCore, accédez à une session à partir de Jetpack XR Runtime.

Configurer la session

La création et le chargement d'ancres ne nécessitent pas la configuration de la session. Toutefois, la persistance des ancres n'est pas activée par défaut dans les sessions XR. Pour conserver et charger des ancres à partir du stockage local, configurez la session et définissez le AnchorPersistenceMode.LOCAL mode :

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

Ancrer du contenu à un emplacement fixe dans l'espace

Une ancre est créée à l'aide d'un Pose, qui peut être interprétée par rapport à un Anchorable existant ou non. Un Anchorable est un Trackable auquel des ancres peuvent être associées.

Créer une ancre par rapport à un Anchorable

Lorsqu'une ancre est créée par rapport à un Anchorable, tel qu'un Plane, l'ancre suit le Anchorable associé lorsqu'il se déplace dans l'espace.

val anchor = plane.createAnchor(pose)

Créer une ancre sans Anchorable

Pour créer une ancre qui n'est pas associée à un Anchorable :

val anchor = Anchor.create(session, pose)

Associer une entité à une ancre

Pour afficher un modèle à cet emplacement, créez un GltfModel et définissez son parent sur un AnchorSpace.

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

Comprendre TrackingState

Chaque Trackable possède un TrackingState qui doit être vérifié avant d'être utilisé. Un Trackable dont le TrackableState est Tracking voit son Pose activement mis à jour par le système. Un Trackable qui est Paused peut devenir Tracking à l'avenir, tandis qu'un Trackable qui est Stopped ne deviendra jamais Tracking.

Conserver une ancre d'une session à l'autre

Une ancre qui n'est pas conservée disparaît après la destruction d'une session. En conservant une ancre, votre application mémorise sa position dans ses données d'application privées. Cette ancre peut être récupérée lors d'une session ultérieure et est ancrée au même endroit dans le monde.

Pour conserver une ancre, utilisez Anchor.persist(), comme indiqué ici :

val uuid = anchor.persist()

Votre application peut récupérer l'ancre à l'aide de la UUID lors d'une session ultérieure :

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

Lorsque vous n'avez plus besoin d'une ancre, appelez unpersist(). Cela supprime l'ancre du stockage de votre application et rend l'UUID donné irrécupérable pour les appels à Anchor.load().

Anchor.unpersist(session, uuid)

Votre application peut également demander une liste de toutes les ancres conservées qui sont toujours présentes dans son stockage :

val uuids = Anchor.getPersistedAnchorUuids(session)