在 Unity 中使用周围的建筑物和地形

Streetscape Geometry API 可提供场景中地形、建筑物或其他结构的几何图形。几何形状可用于通过点击测试 API 实现遮挡、渲染或放置 AR 内容。街景几何图形数据是通过 Google 街景图像获得的。

试用示例

地理空间示例应用演示了如何获取和渲染街景几何图形。

设置 Geospatial API

如需使用 Streetscape Geometry,您需要在项目中设置 Geospatial API。 按照启用 Geospatial API 中的说明设置 Geospatial API。

启用 Streetscape Geometry

GeospatialMode 设置为 GeospatialMode.EnabledStreetscapeGeometryMode 设置为 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 包含建筑物的相关信息:

建筑物 LOD 1

BuildingLOD1 包含向上凸出到平顶的建筑物底部。建筑物高度可能不准确。

建筑物 LOD 2

BuildingLOD2 几何图形的保真度更高。网格墙和屋顶会更贴近建筑物的形状。烟囱或屋顶通风口等较小的部件可能仍会在网状物之外伸出。

了解 Mesh

Mesh 是一个多边形网格,表示 Streetscape Geometry 的表面重建。 请参阅 MeshMeshRenderer。请注意,系统不会默认计算法线值; 请参阅 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,以及局部观测深度。 这可提高使用“深度”时的姿势准确性。