Usar edifícios e terrenos ao seu redor no Android NDK (C)

As APIs Streetscape Geometry fornecem a geometria do terreno, edifícios ou outras estruturas em uma cena. A geometria pode ser usada para obstrução, renderização ou posicionamento de conteúdo de RA por meio de APIs de hit-test. Os dados do Streetscape Geometry são obtidos por meio de imagens do Google Street View.

Configurar a API Geospatial

Para usar a geometria da paisagem urbana, você precisa configurar a API Geospatial no seu projeto. Siga as instruções em Como ativar a API Geospatial para configurar a API Geospatial.

Ativar a geometria da paisagem urbana

A API Geospatial recebe os dados do Streetscape Geometry quando ArGeospatialMode está definido como ArGeospatialModeEnabled e ArStreetscapeGeometryMode está definido como 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);

Extrair a geometria da paisagem urbana em uma sessão do ARCore

Use ArSession_getAllTrackables() e AR_TRACKABLE_STREETSCAPE_GEOMETRY para filtrar os resultados.

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

Entenda o ArStreetscapeGeometry

ArStreetscapeGeometry contém informações sobre um edifício:

Edifício LOD 1

O AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_1 consiste em impressões de construção extrudadas para cima até uma parte superior plana. As alturas dos edifícios podem estar incorretas.

Edifício LOD 2

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_2 terá uma geometria de maior fidelidade. Paredes e telhados de malha vão se aproximar mais do formato do edifício. Recursos menores, como chaminés ou aberturas no telhado, ainda podem sair da rede mesh.

Entender o ArMesh

ArMesh é uma malha de polígonos que representa uma reconstrução de superfície do Streetscape Geometry. Cada ArMesh inclui um buffer de vértice e de índice:

Anexar conteúdo de RA a um ArStreetscapeGeometry

Há duas maneiras de anexar conteúdo de RA à geometria do Street View:

Executar um teste de hit em ArStreetscapeGeometry

ArFrame_hitTest pode ser usado para fazer testes de hit com a geometria da paisagem urbana. Se houver cruzamentos, ArHitResult conterá informações de pose sobre o local do hit, bem como uma referência ao ArStreetscapeGeometry que foi atingido. Esse Streetscape Geometry pode ser transmitido a ArTrackable_acquireNewAnchor() para criar uma âncora anexada a ele.

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

Ativar profundidade geoespacial

A opção Geospatial Depth combina a Geometria do Streetscape com entrada de sensor local para aprimorar dados de profundidade. Quando a opção "Geospatial Depth" está ativada, a profundidade de saída e as imagens de profundidade bruta são modificadas para incluir a imagem rasterizada Streetscape Geometry, além da profundidade observada localmente. Isso pode melhorar a precisão das poses usando a Profundidade.