Streetscape Geometry API 提供场景中地形、建筑物或其他结构的几何图形。该几何图形可用于通过命中测试 API 遮挡、渲染或放置 AR 内容。Streetscape Geometry 数据通过 Google 街景图像获取。
试用示例
Geospatial 示例应用演示了如何获取和渲染 Streetscape Geometries。
设置 Geospatial API
如需使用 Streetscape Geometry,您需要在项目中设置 Geospatial API。 请按照启用 Geospatial API 中的说明设置 Geospatial API。
启用街景几何图形
当 GeospatialMode
设置为 GeospatialMode.Enabled
且 StreetscapeGeometryMode
设置为 StreetscapeGeometryMode.Enabled
时,Geospatial API 会获取 Streetscape Geometry 数据。
在 ARCore 会话中获取 Streetscape Geometry
将ARStreetscapeGeometryManager
组件添加到 GameObject
。添加、更新或移除街景几何图形时,会触发 ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
事件。
public Material streetscapeGeometryMaterial;
List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
public void OnEnable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
GetStreetscapeGeometry;
}
public void Update() {
foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
{
GameObject renderObject = new GameObject(
"StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));
if (renderObject)
{
renderObject.transform.position = streetscapegeometry.pose.position;
renderObject.transform.rotation = streetscapegeometry.pose.rotation;
renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
}
}
}
public void OnDisable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
GetStreetscapeGeometry;
}
private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
_addedStreetscapeGeometries = eventArgs.Added;
_updatedStreetscapeGeometries = eventArgs.Updated;
_removedStreetscapeGeometries = eventArgs.Removed;
}
了解ARStreetscapeGeometry
ARStreetscapeGeometry
包含有关建筑物的信息:
-
ARStreetscapeGeometry.streetscapeGeometryType
将 StreetscapeGeometry 标识为地形或建筑物。 -
ARStreetscapeGeometry.mesh
获取与此地形或建筑物对应的多边形Mesh
。 -
ARStreetscapeGeometry.quality
提供网格数据的质量。详细级别在 CityGML 2.0 标准中进行了介绍。
建筑物 LOD 1
BuildingLOD1
由向上凸出到平顶的建筑物底部组成。建筑物高度可能不准确。
建筑物 LOD 2
BuildingLOD2
的几何图形具有较高的保真度。网格墙和屋顶将更贴近建筑物的形状。烟囱或屋顶通风口等小特征仍可能会戳到网格之外。
了解Mesh
Mesh
是一个多边形网格,表示街景几何图形的表面重建。
请参阅 Mesh
和 MeshRenderer
。请注意,默认情况下,系统不会计算法线;如需计算它们,请参阅 Mesh.RecalculateNormals()
。
将 AR 内容附加到 ARStreetscapeGeometry
使用 ARAnchorManager.AddAnchor()
在 ARStreetscapeGeometry.mesh
中位于指定位置附近的顶点处创建锚点。此锚点将继承父级 ARStreetscapeGeometry
的跟踪状态。
对 ARStreetscapeGeometry
执行点击测试
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
可用于针对 Streetscape Geometry 进行点击测试。如果找到交叉路口,XRRaycastHit
将包含有关命中位置的姿势信息,以及对命中的 ARStreetscapeGeometry
的引用。可以将此街景几何图形传递给 ARAnchorManager.AddAnchor()
,以创建附加到它的锚点。
Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
ARStreetscapeGeometry streetscapegeometry =
StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
if (streetscapegeometry != null)
{
ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
}
}
启用地理空间深度
地理空间深度可将街景几何图形与本地传感器输入相结合,从而增强深度数据。启用地理空间深度后,系统会修改输出深度和原始深度图像,以便除了本地观测的深度之外,还包含光栅化 Streetscape Geometry。这可以使用深度来提高姿势的准确性。