Как получать информацию о глубине в приложении с помощью ARCore для Jetpack 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)

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

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

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

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

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

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

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

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