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.
Testar o exemplo
O app de exemplo geospatial_java demonstra como conseguir e renderizar geometrias da paisagem urbana.
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 GeospatialMode
é definido como GeospatialMode.ENABLED
e StreetscapeGeometryMode
é definido como StreetscapeGeometryMode.ENABLED
.
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 } )
Extrair a geometria da paisagem urbana em uma sessão do ARCore
UseSession.getAllTrackables()
e StreetscapeGeometry.class
para filtrar os resultados.
Java
session.getAllTrackables(StreetscapeGeometry.class);
Kotlin
session.getAllTrackables(StreetscapeGeometry::class.java)
Entenda o StreetscapeGeometry
StreetscapeGeometry
contém informações sobre um edifício:
-
StreetscapeGeometry.getType()
Identifique a StreetscapeGeometry como terreno ou edifício. -
StreetscapeGeometry.getMesh()
Recebe um polígonoMesh
que corresponde a esse terreno ou edifício. -
StreetscapeGeometry.getMeshPose()
Descreve a origem da geometria. Todos os pontos noMesh
precisam ser transformados porStreetscapeGeometry.getMeshPose()
. -
StreetscapeGeometry.getQuality()
Fornece a qualidade dos dados da malha. Os níveis de detalhes são descritos no padrão CityGML 2.0.
Criação de LOD 1
O StreetscapeGeometry.Quality.BUILDING_LOD_1
consiste em impressões de edifícios extrudadas para cima até uma parte superior plana. As alturas dos edifícios podem ser imprecisas.
LOD 2 do edifício
StreetscapeGeometry.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 Mesh
Mesh
é uma malha de polígonos que representa uma reconstrução de superfície da geometria do Streetscape.
Cada Mesh
inclui um buffer de vértice e um buffer de índice:
Mesh.getVertexListSize()
Retorna o número de vértices na malha.Mesh.getVertexList()
Receba as posições concatenadas dos vértices da malha, em coordenadas relativas aStreetscapeGeometry.getMeshPose()
.Mesh.getIndexListSize()
Retorna o número de índices nessa malha.Mesh.getIndexList()
Conseguir os índices dos vértices que compõem um rosto.
Anexar conteúdo de RA a um StreetscapeGeometry
Há duas maneiras de anexar conteúdo de RA à geometria do Street View:
- Ative a Geospatial Depth e use um teste de hit de profundidade. Esse é o método recomendado e mais fácil.
- Use
Trackable.createAnchor()
para criar uma âncora em uma determinada pose anexada a umStreetscapeGeometry
. Essa âncora vai herdar o estado de rastreamento doStreetscapeGeometry
pai.
Realize um teste de hit em StreetscapeGeometry
.
Frame.hitTest()
pode ser usado para fazer testes de hit com a geometria da paisagem urbana. Se houver interseções, HitResult
vai conter informações de pose sobre o local do hit, além de uma referência ao StreetscapeGeometry
que foi atingido. Essa geometria Streetscape pode ser transmitida para Trackable.createAnchor()
para criar uma âncora anexada a ela.
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) } }
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.