Создайте привязки с помощью ARCore для Jetpack XR

Якорь описывает фиксированное местоположение и ориентацию в реальном мире. Прикрепление объекта к якорю помогает объектам выглядеть реалистично расположенными в реальном мире.

Создайте сеанс ARCore для Jetpack XR

Создавайте якоря через сеанс ARCore для Jetpack XR. Чтобы получить Session , см . раздел «Понимание жизненного цикла сеанса» .

Настроить сеанс

Создание и загрузка якорей не требует настройки сеанса. Однако сохранение якорей по умолчанию в сеансах XR отключено. Чтобы сохранять и загружать якоря из локального хранилища, настройте сеанс и установите режим AnchorPersistenceMode.LOCAL :

val newConfig = session.config.copy(
    anchorPersistence = Config.AnchorPersistenceMode.LOCAL,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* A different unhandled exception was thrown. */)
}

Прикрепить контент к фиксированному месту в пространстве

Якорь создается с использованием Pose , который может интерпретироваться относительно существующего Trackable или нет.

Создайте якорь относительно отслеживаемого объекта

Когда якорь создается относительно Trackable объекта, например, Plane , это заставляет якорь следовать за прикрепленным Trackable при его перемещении в пространстве.

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

Создайте якорь без отслеживаемого объекта

Чтобы создать якорь, не прикрепленный к Trackable :

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 Pose TrackableState Tracking активно обновляется системой. Paused Trackable может в будущем стать 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)