Korzystanie z budynków i terenu wokół siebie w Androidzie NDK (C)

Interfejsy API Streetscape Geometry udostępniają geometrię terenu, budynków i innych struktur w scenie. Geometria może służyć do zasłonięcia, renderowania lub umieszczania treści AR za pomocą interfejsów API testowania kolizji. Dane geometryczne dotyczące ulicy są uzyskiwane na podstawie zdjęć Google Street View.

Konfigurowanie interfejsu Geospatial API

Aby korzystać z geometrii Streetscape, musisz skonfigurować interfejs Geospatial API w projekcie. Aby skonfigurować interfejs Geospatial API, wykonaj instrukcje dotyczące włączania interfejsu Geospatial API.

Włączanie geometrii Streetscape

Interfejs Geospatial API uzyskuje dane geometrii Streetscape, gdy parametr ArGeospatialMode ma wartość ArGeospatialModeEnabled, a parametr ArStreetscapeGeometryMode ma wartość ArStreetscapeGeometryModeEnabled.

// 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);

Pobieranie geometrii Streetscape w sesji ARCore

Aby filtrować wyniki, użyj ArSession_getAllTrackables() i 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 zawiera informacje o budynku:

Budynek LOD 1

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_1 składa się z wypukłych rzutów poziomych budynku, które kończą się płaskim szczytem. Wysokość budynków może być niedokładna.

Budynek LOD 2

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_2 będzie mieć geometrię o wyższej jakości. Siatka na ścianach i dachach będzie lepiej dopasowana do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory wentylacyjne w dachu, mogą wystawać poza siatkę.

ArMesh

ArMesh to wielokątna siatka reprezentująca odtworzenie powierzchni geometrii ulicy. Każdy element ArMesh zawiera bufor wierzchołków i bufor indeksów:

Załączanie treści AR do ArStreetscapeGeometry

Treści AR można dołączyć do geometrii Streetscape na 2 sposoby:

Przeprowadź test trafień w przypadku ArStreetscapeGeometry

ArFrame_hitTest można użyć do przetestowania dopasowania do geometrii Streetscape. Jeśli znaleziono punkty przecięcia, ArHitResult zawiera informacje o miejscu uderzenia oraz odniesienie do ArStreetscapeGeometry, które zostało uderzenie. Geometrię ulicy można przekazać do ArTrackable_acquireNewAnchor(), aby utworzyć do niej dołączoną kotwicę.

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);

Włączanie głębi danych geograficznych

Głębia geoprzestrzenna łączy geometrię Streetscape z danymi z lokalnych czujników, aby poprawić dane o głębi. Gdy włączona jest opcja Głębia geoprzestrzenna, obrazy głębi wyjściowej i surowej głębi są modyfikowane, aby uwzględnić rastrową geometrię Streetscape, a nie tylko lokalnie obserwowaną głębię. Może to poprawić dokładność wykrywania póz przy użyciu Depth.