您的应用可以通过 ARCore for Jetpack XR 检索深度信息,以确定实体对象与设备的距离。
创建 ARCore for Jetpack XR 会话
通过 ARCore for Jetpack XR Session 获取深度信息。如果您要使用 Jetpack Compose for XR 增强空间界面,请访问 Jetpack Compose for XR 会话。如果您要使用 Jetpack SceneCore 库中的空间化实体,请从 Jetpack XR 运行时访问会话。
配置会话
默认情况下,XR 会话中未启用深度图检索功能。如需启用深度图检索,请配置会话并设置 DepthEstimationMode:
val newConfig = session.config.copy( depthEstimation = DepthEstimationMode.SMOOTH_ONLY, ) 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 测试应用的深度部分。