Streetscape Geometry API 可提供场景中地形、建筑物或其他结构的几何图形。几何形状可用于通过点击测试 API 实现遮挡、渲染或放置 AR 内容。街景几何图形数据是通过 Google 街景图像获得的。
试用示例
geospatial_java 示例应用演示了如何获取和渲染 Streetscape 几何图形。
设置 Geospatial API
如需使用 Streetscape Geometry,您需要在项目中设置 Geospatial API。 按照启用 Geospatial API 中的说明设置 Geospatial API。
启用 Streetscape Geometry
当 GeospatialMode
设置为 GeospatialMode.ENABLED
且 StreetscapeGeometryMode
设置为 StreetscapeGeometryMode.ENABLED
时,Geospatial API 会获取 Streetscape Geometry 数据。
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
包含建筑物的相关信息:
-
StreetscapeGeometry.getType()
将 StreetscapeGeometry 标识为地形或建筑物。 -
StreetscapeGeometry.getMesh()
获取与该地形或建筑物对应的多边形Mesh
。 -
StreetscapeGeometry.getMeshPose()
描述几何图形的原点。Mesh
中的所有点都应通过StreetscapeGeometry.getMeshPose()
进行转换。 -
StreetscapeGeometry.getQuality()
提供网格数据的质量。CityGML 2.0 标准中介绍了详细程度。
建筑物 LOD 1
StreetscapeGeometry.Quality.BUILDING_LOD_1
包含向上凸出到平顶的建筑物底部。建筑物高度可能不准确。
构建 LOD 2
StreetscapeGeometry.Quality.BUILDING_LOD_2
的几何图形保真度更高。网格墙和屋顶会更贴近建筑物的形状。烟囱或屋顶通风口等较小的部件可能仍会在网状物之外伸出。
了解 Mesh
Mesh
是一个多边形网格,表示 Streetscape Geometry 的表面重建。
每个 Mesh
都包含一个顶点缓冲区和一个索引缓冲区:
Mesh.getVertexListSize()
用于检索此网格中的顶点数。Mesh.getVertexList()
获取网格顶点的串联位置(相对于StreetscapeGeometry.getMeshPose()
的坐标)。Mesh.getIndexListSize()
检索此网格中的索引数量。Mesh.getIndexList()
获取构成面的顶点的索引。
将 AR 内容附加到 StreetscapeGeometry
您可以通过以下两种方式将 AR 内容附加到 Streetscape Geometry:
- 启用地理空间深度,并使用深度点击测试。这是推荐使用的方法,并且这种方法更简单。
- 使用
Trackable.createAnchor()
在附加到StreetscapeGeometry
的给定姿态处创建锚点。此锚点将从父级StreetscapeGeometry
继承其跟踪状态。
对 StreetscapeGeometry
执行点击测试
Frame.hitTest()
可用于对街景几何图形执行点击测试。如果找到交叉路口,HitResult
会包含有关命中位置的姿势信息以及对被命中的 StreetscapeGeometry
的引用。您可以将此街景几何图形传递给 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,以及局部观测深度。 这可能会使用“深度”来提高姿势的准确性。