Streetscape Geometry API 可提供场景中地形、建筑物或其他结构的几何图形。几何形状可用于通过点击测试 API 实现遮挡、渲染或放置 AR 内容。街景几何图形数据是通过 Google 街景图像获得的。
试用示例
地理空间示例应用演示了如何获取和渲染街景几何图形。
设置 Geospatial API
如需使用 Streetscape Geometry,您需要在项目中设置 Geospatial API。 按照启用 Geospatial API 中的说明设置 Geospatial API。
启用 Streetscape Geometry
当 GeospatialMode
设置为 GeospatialMode.Enabled
且 StreetscapeGeometryMode
设置为 StreetscapeGeometryMode.Enabled
时,Geospatial API 会获取 Streetscape Geometry 数据。
在 ARCore 会话中获取街景几何图形
将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
是一个多边形网格,表示 Streetscape Geometry 的表面重建。
请参阅 Mesh
和 MeshRenderer
。请注意,系统不会默认计算法线值;
请参阅 Mesh.RecalculateNormals()
进行计算。
将 AR 内容附加到 ARStreetscapeGeometry
使用 ARAnchorManager.AddAnchor()
在 ARStreetscapeGeometry.mesh
中的顶点附近,在给定姿势处创建锚点。此锚点将从父级 ARStreetscapeGeometry
继承其跟踪状态。
对 ARStreetscapeGeometry
执行点击测试
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
可用于针对 Streetscape Geometry 进行点击测试。如果找到交叉路口,XRRaycastHit
会包含有关命中位置的姿势信息以及对被命中的 ARStreetscapeGeometry
的引用。可将此 Streetscape 几何图形传递给 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);
}
}
启用地理空间深度
Geospatial Depth 结合了街景几何图形 以增强深度数据。启用“地理空间深度”后, 输出深度和原始深度图像会修改为包含光栅化 Streetscape Geometry,以及局部观测深度。 这可提高使用“深度”时的姿势准确性。