Streetscape Geometry API 可提供場景中地形、建築物或其他結構物的幾何圖形。您可以透過命中測試 API 使用幾何圖形來遮蔽、算繪或放置 AR 內容。街景幾何圖形資料是透過 Google 街景服務圖像取得。
試用範例
GeospatialExample 應用程式示範如何取得及算繪街景幾何圖形。
設定 Geospatial API
如要使用街景地形,您必須在專案中設定地理空間 API。按照「啟用 Geospatial API」一節中的操作說明設定 Geospatial API。
啟用街景幾何圖形
當 GARGeospatialMode
設為 GARGeospatialModeEnabled
,而 GARStreetscapeGeometryMode
設為 GARStreetscapeGeometryModeEnabled
時,Geospatial API 會取得街景幾何圖形資料。
GARSessionConfiguration *configuration = [[GARSessionConfiguration alloc] init];
configuration.geospatialMode = GARGeospatialModeEnabled;
configuration.streetscapeGeometryMode = GARStreetscapeGeometryModeEnabled;
[garSession setConfiguration:configuration error:&error];
在 ARCore 工作階段中取得街景幾何圖形
使用GARFrame.streetscapeGeometries
取得所有 GARStreetscapeGeometry
物件。
瞭解 GARStreetscapeGeometry
GARStreetscapeGeometry
包含建築物資訊:
-
GARStreetscapeGeometry.type
將 StreetscapeGeometry 識別為地形或建築物。 -
GARStreetscapeGeometry.mesh
取得與此地形或建築物相對應的多邊形GARMesh
。 -
GARStreetscapeGeometry.meshTransform
說明幾何圖形的起點。GARMesh
中的所有點都應由GARStreetscapeGeometry.meshTransform
轉換。 -
GARStreetscapeGeometry.quality
提供網格資料的品質。詳細程度可參閱 CityGML 2.0 標準。
建構 LOD 1
GARStreetscapeGeometryQualityBuildingLOD_1
包含建築物足跡,向上延伸至平頂。建築物高度可能不準確。
建構 LOD 2
GARStreetscapeGeometryQualityBuildingLOD_2
會提供更高解析度的幾何圖形。網格牆和屋頂會更貼近建築物的形狀。煙囪或屋頂通風口等較小的建築物特徵可能仍會突出網格。
瞭解 GARMesh
GARMesh
是多邊形網格,代表街景幾何圖形的表面重建作業。每個 GARMesh
都包含頂點緩衝區和索引緩衝區:
GARMesh.vertexCount
擷取這個網格中的頂點數。GARMesh.vertices
取得網格頂點的連接位置,以相對於GARStreetscapeGeometry.meshTransform
的座標為準。GARMesh.triangleCount
擷取這個網格中的索引數量。GARMesh.triangles
取得構成面的頂點索引。
將 AR 內容附加至 GARStreetscapeGeometry
使用 GARSesssion.createAnchorOnStreetscapeGeometry:transform:error:
在 GARStreetscapeGeometry.meshTransform
附近的特定姿勢建立錨點。這個錨點會從父項 GARStreetscapeGeometry
繼承追蹤狀態。
針對 GARStreetscapeGeometry
執行命中測試
GARSession.raycastStreetscapeGeometry:direction:error:
可用於對街景幾何圖形進行命中測試。如果偵測到交集,GARStreetscapeGeometryRaycastResult
就會包含撞擊位置的姿勢資訊,以及撞擊的 GARStreetscapeGeometry
參照。這個街景幾何圖形可傳遞至 GARSesssion.createAnchorOnStreetscapeGeometry:transform:error:
,以建立連結至此的錨點。
NSArray<GARStreetscapeGeometryRaycastResult *> *results =
[session raycastStreetscapeGeometry:arRaycastQuery.origin
direction:arRaycastQuery.direction
error:&error];
[session createAnchorOnStreetscapeGeometry:results[0].streetscapeGeometry
transform:results[0].worldTransform
error:&error];