在 Android SDK (Kotlin/Java) 中使用周围的建筑物和地形

Streetscape Geometry API 可提供场景中地形、建筑物或其他结构的几何图形。您可以使用该几何图形通过碰撞检测 API 进行遮挡、渲染或放置 AR 内容。街景几何图形数据是通过 Google 街景图像获取的。

试用示例

geospatial_java 示例应用演示了如何获取和渲染街景几何图形。

设置 Geospatial API

如需使用街景几何图形,您需要在项目中设置 Geospatial API。 按照启用 Geospatial API 中的说明设置 Geospatial API。

启用街景几何图形

GeospatialMode 设置为 GeospatialMode.ENABLEDStreetscapeGeometryMode 设置为 StreetscapeGeometryMode.ENABLED 时,Geospatial API 会获取街景几何图形数据。

Java

Config config = session.getConfig();
// Streetscape Geometry requires the Geospatial API to be enabled.
config.setGeospatialMode(Config.GeospatialMode.ENABLED);
// Enable Streetscape Geometry.
config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED);
session.configure(config);

Kotlin

session.configure(
  session.config.apply {
    // Streetscape Geometry requires the Geospatial API to be enabled.
    geospatialMode = Config.GeospatialMode.ENABLED
    // Enable Streetscape Geometry.
    streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
  }
)

在 ARCore 会话中获取街景几何图形

使用 Session.getAllTrackables()StreetscapeGeometry.class 过滤结果。

Java

session.getAllTrackables(StreetscapeGeometry.class);

Kotlin

session.getAllTrackables(StreetscapeGeometry::class.java)

了解 StreetscapeGeometry

StreetscapeGeometry 包含建筑物相关信息:

建筑物 LOD 1

StreetscapeGeometry.Quality.BUILDING_LOD_1 由向上延伸到平顶的建筑物平面图组成。建筑物高度可能不准确。

构建 LOD 2

StreetscapeGeometry.Quality.BUILDING_LOD_2 将具有更高的几何保真度。网格墙和屋顶将更贴近建筑物的形状。烟囱或屋顶通风口等较小的建筑物特征可能仍会超出网格范围。

了解 Mesh

Mesh 是一个多边形网格,表示街景几何图形的表面重建。 每个 Mesh 都包含一个顶点缓冲区和一个索引缓冲区:

将 AR 内容附加到 StreetscapeGeometry

您可以通过以下两种方式将 AR 内容附加到街景几何图形:

StreetscapeGeometry 执行点击测试

Frame.hitTest() 可用于对街景几何图形执行点击测试。如果找到交叉点,HitResult 将包含与命中位置相关的姿势信息,以及对命中的 StreetscapeGeometry 的引用。此 Streetscape Geometry 可以传递给 Trackable.createAnchor(),以创建与其关联的锚点。

Java

for (HitResult hit : frame.hitTest(singleTapEvent)) {
  if (hit.getTrackable() instanceof StreetscapeGeometry) {
    Pose hitPose = hit.getHitPose();
    hit.getTrackable().createAnchor(hitPose);
  }
}

Kotlin

for (hit in frame.hitTest(singleTapEvent)) {
  if (hit.trackable is StreetscapeGeometry) {
    val hitPose = hit.hitPose
    hit.trackable.createAnchor(hitPose)
  }
}

启用地理深度

Geospatial Depth 将 Streetscape Geometry 与本地传感器输入相结合,以增强深度数据。启用 Geospatial Depth 后,输出深度和原始深度图片会被修改,以包含光栅化街景几何图形以及本地观察到的深度。这可能会提高使用深度数据估算姿势的准确性。