利用地理空间深度扩大范围

地理空间深度主打图片

ARCore Depth API 现在支持 Geospatial Depth,这可以在同时启用 Streetscape Geometry 时自动增加 Depth API 的范围和速度。当位于 VPS 覆盖且已启用 Streetscape Geometry 的位置时,Depth API 的输出图像包括在距离当前位置 65 米的范围内检索到的地形和建筑物几何图形。从几何图形中检索到的深度数据会与局部深度观测结果合并,并随着用户移动到新位置而更新。

<ph type="x-smartling-placeholder"> <ph type="x-smartling-placeholder">

ARCore Depth API 调用现在既提供来自相机的局部观察结果,又提供来自 Streetscape Geometry 的建筑物和地形,并合并为单张深度图像。

设备兼容性

所有支持 Depth API 的设备都可以使用地理空间深度。此功能不需要受支持的硬件深度传感器,例如飞行时间 (ToF) 传感器。不过,Depth API 可以使用设备可能具有的任何受支持的硬件传感器。

性能影响

地理空间深度会在会话开始时引入一个小型一次性计算,以便在初始下载时将 Streetscape Geometry 集成到深度表示中,但除此之外不会明显增加深度计算成本。

深度范围

如果没有地理空间深度,深度图像的典型范围在 20 至 30 米外,而深度观测的密度和准确度会降低,超出该范围。启用地理空间深度后,即使初始移动很小,密集采样深度值通常也会达到最大值 65.535 米。

<ph type="x-smartling-placeholder">

使用场景

ARCore Depth API 可用于已经支持的所有现有用例。借助地理空间深度,在 VPS 支持的位置获得的深度图像将比以往更快地填充远距离深度,使用例能够在户外环境中定位远距离深度。一些使用场景包括:

  • 建筑物级虚拟内容和其他视觉效果的遮挡效果
  • 户外导航
  • 距离测量

限制

只有支持 VPS 定位和 Streetscape Geometry 的区域才支持地理空间深度。在其他区域,ARCore Depth API 将在没有地理空间值的情况下照常运行。

前提条件

确保您了解 AR 基础概念 以及如何在继续之前配置 ARCore 现场录像

启用地理空间深度

新的 ARCore 会话中, 检查用户设备是否支持 Depth 和 Geospatial API。 由于处理能力限制,并非所有与 ARCore 兼容的设备都支持 Depth API。

为节省资源,ARCore 默认停用深度。 启用深度模式,让应用使用 Depth API。 此外,启用 Geospatial 模式和 Streetscape Geometry 还可以 使用地理空间深度。

Java

Config config = session.getConfig();

// Check whether the user's device supports the Depth API.
boolean isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC);
boolean isGeospatialSupported =
    session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED);
if (isDepthSupported && isGeospatialSupported) {
  // These three settings are needed to use Geospatial Depth.
  config.setDepthMode(Config.DepthMode.AUTOMATIC);
  config.setGeospatialMode(Config.GeospatialMode.ENABLED);
  config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED);
}
session.configure(config);

Kotlin

val config = session.config

// Check whether the user's device supports the Depth API.
val isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)
val isGeospatialSupported = session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED)
if (isDepthSupported && isGeospatialSupported) {
  // These three settings are needed to use Geospatial Depth.
  config.depthMode = Config.DepthMode.AUTOMATIC
  config.geospatialMode = Config.GeospatialMode.ENABLED
  config.streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
}
session.configure(config)

启用地理空间深度后,即可通过现有 API 调用访问深度图像,如深度开发者指南中所述。

Java

// Retrieve the depth image for the current frame, if available.
Image depthImage = null;
try {
  depthImage = frame.acquireDepthImage16Bits();
  // Use the depth image here.
} catch (NotYetAvailableException e) {
  // This means that depth data is not available yet.
  // Depth data will not be available if there are no tracked
  // feature points. This can happen when there is no motion, or when the
  // camera loses its ability to track objects in the surrounding
  // environment.
} finally {
  if (depthImage != null) {
    depthImage.close();
  }
}

Kotlin

// Retrieve the depth image for the current frame, if available.
try {
  frame.acquireDepthImage16Bits().use { depthImage ->
    // Use the depth image here.
  }
} catch (e: NotYetAvailableException) {
  // This means that depth data is not available yet.
  // Depth data will not be available if there are no tracked
  // feature points. This can happen when there is no motion, or when the
  // camera loses its ability to track objects in the surrounding
  // environment.
}

后续步骤