As APIs Streetscape Geometry fornecem a geometria do terreno, edifícios ou outras estruturas em uma cena. A geometria pode ser usada para oclusão, renderização ou colocação de conteúdo de RA por meio de APIs de teste de hit. Os dados do Streetscape Geometry são obtidos por meio de 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 o Streetscape Geometry, você precisará configurar a API Geospatial no seu projeto. Siga as instruções em Como ativar a API Geospatial para configurar a API Geospatial.
Ativar Streetscape Geometry
A API Geospatial recebe os dados do Streetscape Geometry quando GeospatialMode
está definido como GeospatialMode.ENABLED
e StreetscapeGeometryMode
está 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 } )
Obter Streetscape Geometry 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)
Entender o StreetscapeGeometry
StreetscapeGeometry
contém informações sobre uma construção:
-
StreetscapeGeometry.getType()
Identifica StreetscapeGeometry como um terreno ou uma construção. -
StreetscapeGeometry.getMesh()
Encontre um polígonoMesh
que corresponda a esse terreno ou construção. -
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
StreetscapeGeometry.Quality.BUILDING_LOD_1
consiste em plantas extruídas para cima até um topo plano. A altura das construções pode estar incorreta.
Edifício LOD 2
StreetscapeGeometry.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 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()
Recupera o número de vértices na malha.Mesh.getVertexList()
Obter as posições concatenadas dos vértices da malha em coordenadas relativas aStreetscapeGeometry.getMeshPose()
Mesh.getIndexListSize()
Recupera o número de índices na malha.Mesh.getIndexList()
Conseguir os índices de vértices que compõem uma face.
Anexar conteúdo de RA a um StreetscapeGeometry
Há duas maneiras de anexar conteúdo de RA ao Streetscape Geometry:
- Ative Profundidade geoespacial e use um Teste de profundidade 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.
Executar um teste de hit em StreetscapeGeometry
Frame.hitTest()
pode ser usado para fazer um teste de hit em relação ao Streetscape Geometry. Se houver cruzamentos, HitResult
conterá informações de pose sobre o local do hit, bem como 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 profundidade geoespacial
A profundidade geoespacial combina a geometria Streetscape Geometry. com entrada de sensor local para aprimorar 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.