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

Streetscape Geometry API 可提供场景中地形、建筑物或其他结构的几何图形。几何形状可用于通过点击测试 API 实现遮挡、渲染或放置 AR 内容。街景几何图形数据是通过 Google 街景图像获得的。

设置 Geospatial API

如需使用 Streetscape Geometry,您需要在项目中设置 Geospatial API。 按照启用 Geospatial API 中的说明设置 Geospatial API。

启用街景几何图形

ArGeospatialMode 设置为 ArGeospatialModeEnabledArStreetscapeGeometryMode 设置为 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 的引用。您可以将此街景几何图形传递给 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 与本地传感器输入相结合,以增强深度数据。启用“地理空间深度”后, 输出深度和原始深度图像会修改为包含光栅化 Streetscape Geometry,以及局部观测深度。 这可能会使用“深度”来提高姿势的准确性。