Как получать информацию о глубине в приложении с помощью ARCore для Jetpack XR

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

Ваше приложение может получать информацию о глубине через ARCore для Jetpack XR, чтобы определять, насколько близко физические объекты находятся к устройству.

Как создать сеанс ARCore для Jetpack XR

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

Настройте сеанс

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

val newConfig = Config.Builder(session.config)
    .setDepthEstimation(DepthEstimationMode.SMOOTH_ONLY)
    .build()
when (val result = session.configure(newConfig)) {
    is SessionConfigureSuccess -> TODO(/* Success! */)
    else ->
        TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */)
}

Доступны следующие значения DepthEstimationMode:

  • DISABLED: информация о глубине сцены не предоставлена.
  • RAW_ONLY – оценка глубины включена с необработанными значениями глубины и достоверности.
  • SMOOTH_ONLY – оценка глубины включена, используются сглаженная глубина и уровень достоверности.
  • SMOOTH_AND_RAW – оценка глубины включена с необработанными и сглаженными значениями глубины и уровня достоверности.

Необработанные карты глубины обеспечивают более высокую точность, но могут не содержать оценки глубины для всех пикселей изображения с камеры. В то же время сглаженные карты глубины предоставляют расчетную глубину для каждого пикселя, но данные о глубине каждого пикселя могут быть менее точными из-за сглаживания и интерполяции оценок глубины.

Как проверить поддержку карт глубины

У разных устройств разные возможности. Устройства со стереокамерой могут предоставлять карты глубины для левой и правой камер. Аналогично, устройства с одной камерой могут предоставлять карты оценки глубины только для монокамеры.

Чтобы проверить, какие карты глубины поддерживаются устройством, используйте XrDevice.isRenderingModeSupported:

val xrDevice = XrDevice.getCurrentDevice(context)
val hasMonoDepth = xrDevice.isRenderingModeSupported(RenderingMode.MONO)
val hasStereoDepth = xrDevice.isRenderingModeSupported(RenderingMode.STEREO)

Получение данных о глубине

Чтобы получить данные о глубине для определенной камеры, используйте Depth:

if (hasStereoDepth) {
    val depthMap = Depth.left(session)
}

Рассчитать значения глубины

Из полученной карты глубины можно получить значения глубины и уровня достоверности:

if (hasStereoDepth) {
    val depthMap = Depth.left(session)
}

В зависимости от используемой конфигурации, доступ к соответствующей карте глубины можно получить с помощью smoothDepthMap или rawDepthMap. Измерения на этих картах выражены в метрах. Уровни достоверности также можно получить с помощью smoothConfidenceMap и rawConfidenceMap. Значения находятся в диапазоне от 0 до 255, где 255 – это максимальная достоверность.

Чтобы отрисовать карту глубины для отладки или визуализации, ознакомьтесь с разделом Depth тестового приложения ARCore.