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

As APIs Streetscape Geometry fornecem a geometria de terrenos, 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 de geometria da paisagem urbana são obtidos com as 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 extrai dados da geometria da paisagem urbana quando ArGeospatialMode é definido como ArGeospatialModeEnabled e ArStreetscapeGeometryMode é 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:

Criação de 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.

LOD 2 do edifício

AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_2 terá uma geometria de maior fidelidade. As paredes e os telhados de malha vão se ajustar melhor à forma do edifício. Elementos menores, como chaminés ou aberturas no telhado, ainda podem aparecer fora da malha.

Entenda o ArMesh

ArMesh é uma malha de polígonos que representa uma reconstrução de superfície da geometria da paisagem urbana. Cada ArMesh inclui um buffer de vértices e um buffer de índice:

Anexar conteúdo de RA a um ArStreetscapeGeometry

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

Realize um teste de hit em ArStreetscapeGeometry.

ArFrame_hitTest pode ser usado para fazer testes de hit com a geometria da paisagem urbana. Se houver interseções, ArHitResult vai conter informações sobre o local do hit e uma referência ao ArStreetscapeGeometry que foi atingido. Essa geometria Streetscape pode ser transmitida para ArTrackable_acquireNewAnchor() para criar uma âncora anexada a ela.

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 a profundidade geoespacial

A Geospatial Depth combina a Streetscape Geometry com a entrada do sensor local para melhorar os dados de profundidade. Quando a API Geospatial Depth está ativada, a profundidade de saída e as imagens de profundidade bruta são modificadas para incluir a geometria da paisagem urbana rasterizada, além da profundidade observada localmente. Isso pode melhorar a precisão das poses usando a profundidade.