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
包含建筑物相关信息:
-
ArStreetscapeGeometry_getType()
将 StreetscapeGeometry 标识为地形或建筑物。 -
ArStreetscapeGeometry_acquireMesh()
获取与此地形或建筑物相对应的多边形ArMesh
。 -
ArStreetscapeGeometry_getMeshPose()
描述几何图形的原点。ArMesh
中的所有点都应由ArStreetscapeGeometry_getMeshPose()
转换。 -
ArStreetscapeGeometry_getQuality()
提供网格数据的质量。CityGML 2.0 标准中介绍了详细级别。
建筑物 LOD 1
AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_1
由向上延伸到平顶的建筑物平面图组成。建筑物高度可能不准确。
构建 LOD 2
AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_2
将具有更高的几何保真度。网格墙和屋顶将更贴近建筑物的形状。烟囱或屋顶通风口等较小的建筑物特征可能仍会超出网格范围。
了解 ArMesh
ArMesh
是一个多边形网格,表示街景几何图形的表面重建。
每个 ArMesh
都包含一个顶点缓冲区和一个索引缓冲区:
ArMesh_getVertexListSize()
检索此网格的顶点数。ArMesh_getVertexList()
获取网格顶点的串联位置,以相对于ArStreetscapeGeometry_getMeshPose()
的坐标表示。ArMesh_getIndexListSize()
检索此网格中的索引数量。ArMesh_getIndexList()
获取构成面片的顶点的索引。
将 AR 内容附加到 ArStreetscapeGeometry
您可以通过以下两种方式将 AR 内容附加到街景几何图形:
- 启用地理深度并使用深度点击测试。这是推荐的更简单的方法。
- 使用
ArTrackable_acquireNewAnchor()
在给定姿势下创建一个锚点,并将其附加到ArStreetscapeGeometry
。此锚点将从父级ArStreetscapeGeometry
继承其跟踪状态。
对 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 后,输出深度和原始深度图片会被修改,以包含光栅化街景几何图形以及本地观察到的深度。这可能会提高使用深度数据估算姿势的准确性。