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

Streetscape Geometry API 可提供場景中地形、建築物或其他結構物的幾何圖形。您可以透過命中測試 API 使用幾何圖形來遮蔽、算繪或放置 AR 內容。街景幾何圖形資料是透過 Google 街景服務圖像取得。

試用範例

地理空間範例應用程式示範如何取得及算繪街景幾何圖形。

設定 Geospatial API

如要使用街景地形,您必須在專案中設定地理空間 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 包含建築物資訊:

建構 LOD 1

BuildingLOD1 包含建築物足跡,向上延伸至平頂。建築物高度可能不準確。

建構 LOD 2

BuildingLOD2 會提供更高解析度的幾何圖形。網格牆和屋頂會更貼近建築物的形狀。煙囪或屋頂通風口等較小的建築物特徵可能仍會突出網格。

瞭解 Mesh

Mesh 是多邊形網格,代表街景幾何圖形的表面重建作業。請參閱 Mesh 和 MeshRenderer。請注意,根據預設,系統不會計算法線;請參閱 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);
  }
}

啟用地理空間景深

地理空間深度功能會結合街景幾何圖形和本機感應器輸入內容,以強化深度資料。啟用地理空間深度後,除了當地觀察到的深度,輸出深度和原始深度圖片也會修改為包含光柵化街景幾何圖形。這可能會提高使用深度資料的姿勢準確度。