在 Android NDK (C) 上使用您周遭的建築物和地形

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

設定 Geospatial API

如要使用街景地形,您必須在專案中設定地理空間 API。按照「啟用 Geospatial API」一節中的操作說明設定 Geospatial API。

啟用街景幾何圖形

當 ArGeospatialMode 設為 ArGeospatialModeEnabled,而 ArStreetscapeGeometryMode 設為 ArStreetscapeGeometryModeEnabled 時,Geospatial API 會取得街景幾何圖形資料。

// Create a session config.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);

// Enable the Geospatial API.
ArConfig_setGeospatialMode(ar_session, ar_config, AR_GEOSPATIAL_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Enable Streetscape Geometry.
ArConfig_setStreetscapeGeometryMode(ar_session, ar_config, AR_STREETSCAPE_GEOMETRY_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Release config resources.
ArConfig_destroy(ar_config);

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

使用 ArSession_getAllTrackables() 和 AR_TRACKABLE_STREETSCAPE_GEOMETRY 篩選結果。

ArTrackableList* trackable_list = NULL;
ArTrackableList_create(ar_session, &trackable_list);
ArSession_getAllTrackables(ar_session, AR_TRACKABLE_STREETSCAPE_GEOMETRY, trackable_list);

瞭解 ArStreetscapeGeometry

ArStreetscapeGeometry 包含建築物資訊:

建構 LOD 1

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_1 包含建築物足跡,向上延伸至平頂。建築物高度可能不準確。

建構 LOD 2

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_2 會提供更高解析度的幾何圖形。網格牆和屋頂會更貼近建築物的形狀。煙囪或屋頂通風口等較小的建築物特徵可能仍會突出網格。

瞭解 ArMesh

ArMesh 是多邊形網格,代表街景幾何圖形的表面重建作業。每個 ArMesh 都包含頂點緩衝區和索引緩衝區:

將 AR 內容附加至 ArStreetscapeGeometry

將 AR 內容附加至街景地形的兩種方式如下:

針對 ArStreetscapeGeometry 執行命中測試

ArFrame_hitTest 可用於對街景幾何圖形進行命中測試。如果偵測到交集,ArHitResult 就會包含撞擊位置的姿勢資訊,以及撞擊的 ArStreetscapeGeometry 參照。這個街景幾何圖形可傳遞至 ArTrackable_acquireNewAnchor(),以建立連結至此的錨點。

ArHitResultList *hit_result_list = NULL;
ArHitResult *hit_result = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
ArHitResult_create(ar_session, &hit_result);

ArFrame_hitTestRay(ar_session, ar_frame, origin, direction, hit_result_list);
ArHitResultList_getItem(ar_session, hit_result_list, 0, hit_result);

ArAnchor *out_anchor = NULL;
ArStatus status = ArHitResult_acquireNewAnchor(ar_session, hit_result, &out_anchor);
CHECK(status == AR_SUCCESS);

啟用地理空間景深

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