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 dans le monde réel. Associer un objet à une ancre permet aux objets d'apparaître de manière réaliste dans le monde réel et à votre application d'économiser de l'énergie en n'ayant pas à exécuter de logique à chaque frame.

Accéder à une session

Créez des ancres via un 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 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 fixée dans le monde. 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, cela permet à l'ancre de suivre l'Anchorable associé lorsqu'il se déplace dans l'espace.

val anchor = plane.createAnchor(pose)

Créer une ancre fixe dans le monde

Pour créer une ancre fixe dans le monde, ne l'associez pas à un Anchorable. N'utilisez ce type d'ancre que pour les points qui flottent dans l'espace, car l'estimation de la session de l'emplacement des objets immobiles change au fil du temps :

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.

AnchorSpace.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 mis à jour activement par le système. Un Trackable qui est Paused peut devenir Tracking à l'avenir, tandis qu'un Stopped ne le deviendra jamais Tracking.

Conserver une ancre tout au long des sessions

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 le stockage de votre application :

val uuids = Anchor.getPersistedAnchorUuids(session)