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

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

試用範例

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

設定 Geospatial API

如要使用 Streetscape 幾何圖形,必須先在專案中設定 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 包含建築物資訊:

建築物 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);
  }
}

啟用地理空間景深

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