在 Unity 中使用周遭建築物和地形

Streetscape 幾何圖形 API 提供場景中地形、建築物或其他建築物的幾何圖形。透過命中測試 API,幾何圖形可用於遮蔽、顯示或放置 AR 內容。可透過 Google 街景服務圖像取得街景服務幾何圖形資料。

試用範例

Geospatial 範例應用程式說明如何取得及算繪街景服務幾何圖形。

設定 Geospatial API

如要使用 Streetscape 幾何圖形,必須先在專案中設定 Geospatial API。 按照操作說明啟用 Geospatial API,設定 Geospatial API。

啟用 Streetscape 幾何圖形

GeospatialMode 設為 GeospatialMode.Enabled,且 StreetscapeGeometryMode 設為 StreetscapeGeometryMode.Enabled 時,Geospatial API 可取得街景服務幾何圖形資料。

在 ARCore 工作階段中取得 Streetscape 幾何圖形

GameObject 中新增 ARStreetscapeGeometryManager 元件。時間 新增、更新或移除街景服務幾何圖形時,會觸發 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 是一個多邊形網格,代表街景服務幾何圖形的表面重建。 請查看 MeshMeshRenderer。請注意,根據預設,系統不會計算正常值; 請參閱 Mesh.RecalculateNormals() 進行計算。

將 AR 內容附加至 ARStreetscapeGeometry

使用 ARAnchorManager.AddAnchor()ARStreetscapeGeometry.mesh 中的指定姿勢附近建立錨點。這個錨定標記會沿用上層 ARStreetscapeGeometry 的追蹤狀態。

ARStreetscapeGeometry 執行命中測試

ARRaycastManagerExtensions.RaycastStreetscapeGeometry 可用於對照街景服務幾何圖形,進行測試。如果有找到的十字路口,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);
  }
}

啟用地理空間深度

地理空間深度:結合街景服務幾何圖形 來強化深度資料。啟用地理空間深度後, 除了在本機觀察到的深度之外,輸出的深度和原始深度影像都經過修改,加入光柵化的街景服務幾何圖形。 這可透過深度運算提升姿勢的準確度。