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
包含建築物的相關資訊:
-
ARStreetscapeGeometry.streetscapeGeometryType
將 StreetscapeGeometry 指定為地形或建築物。 -
ARStreetscapeGeometry.mesh
取得與這個地形或建築物對應的多邊形Mesh
。 -
ARStreetscapeGeometry.quality
提供網格資料品質。如要瞭解細節層級,請參閱 CityGML 2.0 標準。
建築物 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);
}
}
啟用地理空間深度
地理空間深度:結合街景服務幾何圖形 來強化深度資料。啟用地理空間深度後, 除了在本機觀察到的深度之外,輸出的深度和原始深度影像都經過修改,加入光柵化的街景服務幾何圖形。 這可透過深度運算提升姿勢的準確度。