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

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

試用範例

地理空間範例應用程式示範如何取得並呈現街景幾何圖形。

設定地理空間 API

如要使用 Streetscape 幾何圖形,您必須在專案中設定 Geospatial API。 請按照啟用地理空間 API 的操作說明設定 Geospatial API。

啟用街景幾何圖形

GeospatialMode 設為 GeospatialMode.EnabledStreetscapeGeometryMode 設為 StreetscapeGeometryMode.Enabled 時,Geospatial API 會取得街景幾何圖形資料。

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

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 可用於對 Streetscape 幾何圖形進行測試。如果有交集,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);
  }
}

啟用地理空間深度

地理空間深度結合街景幾何圖形與本機感應器輸入資料,有效提升深度資料。啟用地理空間深度後,系統會修改輸出深度和原始深度圖片,藉此納入光柵化的街景幾何圖形,以及當地的觀測深度。這有助於提高姿勢使用深度。