Streetscape 幾何圖形 API 提供場景中地形、建築物或其他建築物的幾何圖形。透過命中測試 API,幾何圖形可用於遮蔽、顯示或放置 AR 內容。可透過 Google 街景服務圖像取得街景服務幾何圖形資料。
試用範例
geospatial_java 範例應用程式示範如何取得及算繪街景地圖幾何圖形。
設定 Geospatial API
如要使用 Streetscape 幾何圖形,必須先在專案中設定 Geospatial API。 按照操作說明啟用 Geospatial API,設定 Geospatial API。
啟用 Streetscape 幾何圖形
當 GeospatialMode
設為 GeospatialMode.ENABLED
,而 StreetscapeGeometryMode
設為 StreetscapeGeometryMode.ENABLED
時,Geospatial API 會取得街景幾何圖形資料。
Java
Config config = session.getConfig(); // Streetscape Geometry requires the Geospatial API to be enabled. config.setGeospatialMode(Config.GeospatialMode.ENABLED); // Enable Streetscape Geometry. config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED); session.configure(config);
Kotlin
session.configure( session.config.apply { // Streetscape Geometry requires the Geospatial API to be enabled. geospatialMode = Config.GeospatialMode.ENABLED // Enable Streetscape Geometry. streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED } )
在 ARCore 工作階段中取得 Streetscape 幾何圖形
使用Session.getAllTrackables()
和 StreetscapeGeometry.class
篩選結果。
Java
session.getAllTrackables(StreetscapeGeometry.class);
Kotlin
session.getAllTrackables(StreetscapeGeometry::class.java)
瞭解 StreetscapeGeometry
StreetscapeGeometry
包含建築物的相關資訊:
-
StreetscapeGeometry.getType()
將 StreetscapeGeometry 指定為地形或建築物。 -
StreetscapeGeometry.getMesh()
取得與這個地形或建築物對應的多邊形Mesh
。 -
StreetscapeGeometry.getMeshPose()
說明幾何圖形的起源。Mesh
中的所有點都應由StreetscapeGeometry.getMeshPose()
轉換。 -
StreetscapeGeometry.getQuality()
提供網格資料品質。詳細程度可參閱 CityGML 2.0 標準。
建築物 LOD 1
StreetscapeGeometry.Quality.BUILDING_LOD_1
包含向上延伸至平坦的建築物平面圖。建築物高度可能不準確。
建築物 LOD 2
StreetscapeGeometry.Quality.BUILDING_LOD_2
的幾何圖形較保真度較高,網格的牆面和屋頂會更接近建築物的形狀。不過,某些小型功能 (例如煙囪或屋頂通風口) 仍可能在網格外發出。
瞭解 Mesh
Mesh
是一個多邊形網格,代表街景服務幾何圖形的表面重建。
每個 Mesh
都包含頂點緩衝區和索引緩衝區:
Mesh.getVertexListSize()
擷取這個網格中的頂點數量。Mesh.getVertexList()
取得網格頂點的串連位置 (相對於StreetscapeGeometry.getMeshPose()
。Mesh.getIndexListSize()
擷取這個網格中的索引數量。Mesh.getIndexList()
取得構成表面的頂點索引。
將 AR 內容附加至 StreetscapeGeometry
有兩種方法可將 AR 內容附加至街景服務幾何圖形:
- 啟用「地理空間深度」,並使用深度命中測試。這是建議做法,也較簡單。
- 使用
Trackable.createAnchor()
建立錨點於StreetscapeGeometry
的指定姿勢。這個錨定標記會沿用上層StreetscapeGeometry
的追蹤狀態。
對 StreetscapeGeometry
執行命中測試
Frame.hitTest()
可用於對照街景服務幾何圖形,進行測試。如果有找到的十字路口,HitResult
會包含命中位置的相關資訊,以及找到的 StreetscapeGeometry
參照。您可以將這個街景服務幾何圖形傳遞至 Trackable.createAnchor()
,以建立連接至該街景服務的錨點。
Java
for (HitResult hit : frame.hitTest(singleTapEvent)) { if (hit.getTrackable() instanceof StreetscapeGeometry) { Pose hitPose = hit.getHitPose(); hit.getTrackable().createAnchor(hitPose); } }
Kotlin
for (hit in frame.hitTest(singleTapEvent)) { if (hit.trackable is StreetscapeGeometry) { val hitPose = hit.hitPose hit.trackable.createAnchor(hitPose) } }
啟用地理空間深度
地理空間深度:結合街景服務幾何圖形 來強化深度資料。啟用地理空間深度後, 除了在本機觀察到的深度之外,輸出的深度和原始深度影像都經過修改,加入光柵化的街景服務幾何圖形。 這可透過深度運算提升姿勢的準確度。