Die Streetscape Geometry APIs liefern die Geometrie von Gelände, Gebäuden oder anderen Strukturen in einer Szene. Die Geometrie kann für die Okklusion, das Rendering oder das Platzieren von AR-Inhalten über Hit-Test-APIs verwendet werden. Die Daten zur Straßenraumgeometrie werden aus Google Street View-Bildern gewonnen.
Beispiel testen
In der Beispielanwendung „geospatial_java“ wird gezeigt, wie Sie Straßenansichten-Geometrien abrufen und rendern.
Geospatial API einrichten
Wenn Sie Streetscape-Geometrie verwenden möchten, müssen Sie die Geospatial API in Ihrem Projekt einrichten. Folgen Sie der Anleitung unter Geospatial API aktivieren, um die Geospatial API einzurichten.
Geometrie für Straßenzüge aktivieren
Die Geospatial API ruft Daten zur Straßengeometrie ab, wenn GeospatialMode
auf GeospatialMode.ENABLED
und StreetscapeGeometryMode
auf StreetscapeGeometryMode.ENABLED
festgelegt ist.
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 } )
Street View-Geometrie in einer ARCore-Sitzung abrufen
Verwenden SieSession.getAllTrackables()
und StreetscapeGeometry.class
, um Ergebnisse zu filtern.
Java
session.getAllTrackables(StreetscapeGeometry.class);
Kotlin
session.getAllTrackables(StreetscapeGeometry::class.java)
StreetscapeGeometry
StreetscapeGeometry
enthält Informationen zu einem Gebäude:
-
StreetscapeGeometry.getType()
Gibt an, ob die StreetscapeGeometry als Gelände oder Gebäude gekennzeichnet ist. -
StreetscapeGeometry.getMesh()
Ermitteln Sie ein PolygonMesh
, das diesem Gelände oder Gebäude entspricht. -
StreetscapeGeometry.getMeshPose()
Beschreibt den Ursprung der Geometrie. Alle Punkte in derMesh
sollten mitStreetscapeGeometry.getMeshPose()
transformiert werden. -
StreetscapeGeometry.getQuality()
Gibt die Qualität der Mesh-Daten an. Detailebenen werden im CityGML 2.0-Standard beschrieben.
Gebäude – LOD 1
StreetscapeGeometry.Quality.BUILDING_LOD_1
besteht aus Gebäudegrundrissen, die nach oben zu einer flachen Oberseite extrudiert wurden. Gebäudehöhen können ungenau sein.
Gebäude-LOD 2
StreetscapeGeometry.Quality.BUILDING_LOD_2
hat eine höhere Geometrietreue. Mesh-Wände und -Dächer entsprechen der Form des Gebäudes besser. Kleinere Elemente wie Schornsteine oder Dachlüftungsöffnungen ragen möglicherweise noch über das Mesh hinaus.
Mesh
Mesh
ist ein Polygon-Mesh, das eine Oberflächenrekonstruktion der Straßengeometrie darstellt.
Jede Mesh
enthält einen Vertex- und einen Index-Buffer:
Mesh.getVertexListSize()
Ruft die Anzahl der Eckpunkte in diesem Mesh ab.Mesh.getVertexList()
Die zusammenhängenden Positionen der Mesh-Eckpunkte in Koordinaten relativ zuStreetscapeGeometry.getMeshPose()
abrufen.Mesh.getIndexListSize()
Ruft die Anzahl der Indexe in diesem Mesh ab.Mesh.getIndexList()
Indexe der Eckpunkte abrufen, die ein Gesicht bilden.
AR-Inhalte an eine StreetscapeGeometry
anhängen
Es gibt zwei Möglichkeiten, AR-Inhalte an Street View-Geometrie anzuhängen:
- Aktivieren Sie Geospatial Depth und verwenden Sie einen Tiefen-Treffertest. Dies ist die empfohlene und einfachere Methode.
- Verwenden Sie
Trackable.createAnchor()
, um einen Anker in einer bestimmten Pose zu erstellen, der an einemStreetscapeGeometry
angehängt ist. Der Tracking-Status dieses Ankers wird vom übergeordneten ElementStreetscapeGeometry
übernommen.
Führen Sie einen Treffertest für StreetscapeGeometry
durch.
Frame.hitTest()
kann für einen Treffertest mit der Straßenraumgeometrie verwendet werden. Wenn Überschneidungen gefunden werden, enthält HitResult
Informationen zur Pose am Auftreffpunkt sowie einen Verweis auf die StreetscapeGeometry
, die getroffen wurde. Diese Straßenansichtsgeometrie kann an Trackable.createAnchor()
übergeben werden, um einen daran angehängten Anker zu erstellen.
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) } }
Geospatial Depth aktivieren
Geospatial Depth kombiniert die Geometrie der Straßenansicht mit lokalen Sensordaten, um die Tiefendaten zu verbessern. Wenn die raumbezogene Tiefe aktiviert ist, werden die Ausgabetiefe und die Rohtiefebilder so geändert, dass sie zusätzlich zur lokal beobachteten Tiefe eine gerasterte Streetscape-Geometrie enthalten. Dies kann die Genauigkeit von Posen mithilfe von Depth verbessern.