在 iOS 设备上使用周围的建筑物和地形

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

试用示例

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

设置 Geospatial API

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

启用街景几何图形

当 GARGeospatialMode 设置为 GARGeospatialModeEnabled 且 GARStreetscapeGeometryMode 设置为 GARStreetscapeGeometryModeEnabled 时,Geospatial API 会获取街景几何图形数据。

GARSessionConfiguration *configuration = [[GARSessionConfiguration alloc] init];
configuration.geospatialMode = GARGeospatialModeEnabled;
configuration.streetscapeGeometryMode = GARStreetscapeGeometryModeEnabled;
[garSession setConfiguration:configuration error:&error];

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

使用 GARFrame.streetscapeGeometries 获取所有 GARStreetscapeGeometry 对象。

了解 GARStreetscapeGeometry

GARStreetscapeGeometry 包含建筑物相关信息:

建筑物 LOD 1

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

构建 LOD 2

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

了解 GARMesh

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

将 AR 内容附加到 GARStreetscapeGeometry

使用 GARSesssion.createAnchorOnStreetscapeGeometry:transform:error: 在 GARStreetscapeGeometry.meshTransform 附近的给定姿势处创建锚点。此锚点将从父级 GARStreetscapeGeometry 继承其跟踪状态。

对 GARStreetscapeGeometry 执行点击测试

GARSession.raycastStreetscapeGeometry:direction:error: 可用于对街景几何图形执行点击测试。如果找到了交叉点,GARStreetscapeGeometryRaycastResult 将包含与命中位置相关的姿势信息,以及对命中的 GARStreetscapeGeometry 的引用。此 Streetscape Geometry 可以传递给 GARSesssion.createAnchorOnStreetscapeGeometry:transform:error:,以创建与其关联的锚点。

NSArray<GARStreetscapeGeometryRaycastResult *> *results =
    [session raycastStreetscapeGeometry:arRaycastQuery.origin
                              direction:arRaycastQuery.direction
                                  error:&error];
[session createAnchorOnStreetscapeGeometry:results[0].streetscapeGeometry
                                 transform:results[0].worldTransform
                                     error:&error];