在 Android NDK (C) 中使用周围的建筑物和地形

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

设置 Geospatial API

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

启用街景几何图形

当 ArGeospatialMode 设置为 ArGeospatialModeEnabled 且 ArStreetscapeGeometryMode 设置为 ArStreetscapeGeometryModeEnabled 时,Geospatial API 会获取街景几何图形数据。

// Create a session config.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);

// Enable the Geospatial API.
ArConfig_setGeospatialMode(ar_session, ar_config, AR_GEOSPATIAL_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Enable Streetscape Geometry.
ArConfig_setStreetscapeGeometryMode(ar_session, ar_config, AR_STREETSCAPE_GEOMETRY_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Release config resources.
ArConfig_destroy(ar_config);

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

使用 ArSession_getAllTrackables() 和 AR_TRACKABLE_STREETSCAPE_GEOMETRY 过滤结果。

ArTrackableList* trackable_list = NULL;
ArTrackableList_create(ar_session, &trackable_list);
ArSession_getAllTrackables(ar_session, AR_TRACKABLE_STREETSCAPE_GEOMETRY, trackable_list);

了解 ArStreetscapeGeometry

ArStreetscapeGeometry 包含建筑物相关信息:

建筑物 LOD 1

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

构建 LOD 2

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

了解 ArMesh

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

将 AR 内容附加到 ArStreetscapeGeometry

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

对 ArStreetscapeGeometry 执行点击测试

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

ArHitResultList *hit_result_list = NULL;
ArHitResult *hit_result = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
ArHitResult_create(ar_session, &hit_result);

ArFrame_hitTestRay(ar_session, ar_frame, origin, direction, hit_result_list);
ArHitResultList_getItem(ar_session, hit_result_list, 0, hit_result);

ArAnchor *out_anchor = NULL;
ArStatus status = ArHitResult_acquireNewAnchor(ar_session, hit_result, &out_anchor);
CHECK(status == AR_SUCCESS);

启用地理深度

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