Как создавать якоря с помощью ARCore для Jetpack XR

Поддерживаемые XR-устройства
Это руководство поможет вам создавать контент для таких устройств.
XR-шлемы
Проводные XR-очки

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

Как получить доступ к сеансу

Создавайте якоря с помощью ARCore для Jetpack XR Session. Если вы улучшаете пространственный интерфейс с помощью Jetpack Compose для XR, получите доступ к сеансу из Jetpack Compose для XR. Если вы работаете с пространственными объектами из библиотеки Jetpack SceneCore, получите доступ к сеансу из Jetpack XR Runtime.

Как настроить сеанс

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

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

Как привязать контент к определенному месту

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

Как создать якорь относительно объекта Anchorable

Если создать якорь относительно Anchorable, например Plane, то якорь будет следовать за прикрепленным Anchorable, когда тот перемещается в пространстве.

val anchor = plane.createAnchor(pose)

Как создать якорь, закрепленный в мире

Чтобы создать якорь, закрепленный в мире, не прикрепляйте его к объекту Anchorable. Используйте этот тип якоря только для точек, которые плавают в пространстве, поскольку оценка сеанса местоположения неподвижных объектов меняется со временем:

val anchor = Anchor.create(session, pose)

Как прикрепить объект к якорю

Чтобы отрисовать модель в этом месте, создайте GltfModel и задайте для его родительского элемента значение AnchorSpace.

AnchorSpace.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)