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