Якорь описывает фиксированное местоположение и ориентацию в реальном мире. Прикрепление объекта к якорю помогает объектам выглядеть реалистично расположенными в реальном мире.
Получить доступ к сессии
Создавайте якоря через Session ARCore для Jetpack XR. Если вы улучшаете пространственный пользовательский интерфейс с помощью Jetpack Compose for XR, получите доступ к сессии из Jetpack Compose for XR . Если вы работаете с пространственно-ориентированными объектами из библиотеки Jetpack SceneCore, получите доступ к сессии из Jetpack XR Runtime .
Настройте сессию
Создание и загрузка якорей не требуют настройки сессии. Однако сохранение якорей по умолчанию отключено в сессиях XR. Для сохранения и загрузки якорей из локального хранилища настройте сессию и установите режим AnchorPersistenceMode.LOCAL :
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. */) }
Привязать контент к фиксированному месту в пространстве
Якорь создается с помощью Pose , который может интерпретироваться относительно существующего объекта Anchorable или нет. Объект Anchorable — это объект Trackable , к которому можно прикреплять якоря.
Создайте привязку относительно объекта Anchorable.
Когда якорь создается относительно объекта, к которому Anchorable , например, Plane , это заставляет якорь следовать за прикрепленным Anchorable когда тот перемещается в пространстве.
when (val result = anchorable.createAnchor(pose)) { is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ } else -> { /* handle failure */ } }
Создать якорь без использования Anchoreable
Чтобы создать якорь, не привязанный к объекту Anchorable :
when (val result = Anchor.create(session, pose)) { is AnchorCreateSuccess -> { /* anchor stored in `result.anchor`. */ } else -> { /* handle failure */ } }
Прикрепить объект к якорю
Чтобы отобразить модель в этом месте, создайте GltfModel и установите в качестве его родительского объекта AnchorEntity .
AnchorEntity.create(session, anchor).apply { parent = session.scene.activitySpace addChild(entity) }
Понимание состояния отслеживания (TrackingState)
Каждый Trackable имеет TrackingState , которое следует проверять перед использованием. Trackable со значением TrackableState , равным Tracking , система активно обновляет его Pose . Trackable объект, находящийся Paused , может перейти в Tracking в будущем, тогда как объект, находящийся Stopped никогда не перейдет в Tracking .
Сохраняйте опору на протяжении всех сессий.
Несохраненная привязка исчезает после завершения сессии. Сохраняя привязку, ваше приложение запоминает ее положение в своих закрытых данных. Эту привязку можно восстановить в последующей сессии, и она будет привязана к тому же местоположению в мире.
Для сохранения привязки используйте Anchor.persist() , как показано здесь:
val uuid = anchor.persist()
Ваше приложение сможет получить доступ к якорю, используя UUID в будущей сессии:
when (val result = Anchor.load(session, uuid)) { is AnchorCreateSuccess -> { // Loading was successful. The anchor is stored in result.anchor. } else -> { // handle failure } }
Когда якорь больше не нужен, вызовите unpersist() . Это удалит якорь из хранилища вашего приложения и сделает указанный UUID недоступным для вызовов метода ` Anchor.load() .
Anchor.unpersist(session, uuid)
Ваше приложение также может запросить список всех сохраненных якорей, которые все еще присутствуют в хранилище вашего приложения:
val uuids = Anchor.getPersistedAnchorUuids(session)