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

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

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

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

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

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

val newConfig = session.config.copy(
    anchorPersistence = Config.AnchorPersistenceMode.Enabled,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

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

Якорь создается с помощью 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 {
    setParent(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)