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. Daten zur Straßenraumgeometrie werden aus Google Street View-Bildern gewonnen.
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 ArGeospatialMode
auf ArGeospatialModeEnabled
und ArStreetscapeGeometryMode
auf ArStreetscapeGeometryModeEnabled
festgelegt ist.
// 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);
Street View-Geometrie in einer ARCore-Sitzung abrufen
Verwenden SieArSession_getAllTrackables()
und AR_TRACKABLE_STREETSCAPE_GEOMETRY
, um Ergebnisse zu filtern.
ArTrackableList* trackable_list = NULL; ArTrackableList_create(ar_session, &trackable_list); ArSession_getAllTrackables(ar_session, AR_TRACKABLE_STREETSCAPE_GEOMETRY, trackable_list);
ArStreetscapeGeometry
ArStreetscapeGeometry
enthält Informationen zu einem Gebäude:
-
ArStreetscapeGeometry_getType()
Gibt an, ob die StreetscapeGeometry als Gelände oder Gebäude gekennzeichnet ist. -
ArStreetscapeGeometry_acquireMesh()
Ermitteln Sie ein PolygonArMesh
, das diesem Gelände oder Gebäude entspricht. -
ArStreetscapeGeometry_getMeshPose()
Beschreibt den Ursprung der Geometrie. Alle Punkte in derArMesh
sollten mitArStreetscapeGeometry_getMeshPose()
transformiert werden. -
ArStreetscapeGeometry_getQuality()
Gibt die Qualität der Mesh-Daten an. Detailebenen werden im CityGML 2.0-Standard beschrieben.
Gebäude – LOD 1
AR_STREETSCAPE_GEOMETRY_QUALITY_BUILDING_LOD_1
besteht aus Gebäudegrundrissen, die nach oben zu einer flachen Oberseite extrudiert werden. Gebäudehöhen können ungenau sein.
Gebäude-LOD 2
AR_STREETSCAPE_GEOMETRY_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 können noch über das Mesh hinausragen.
ArMesh
ArMesh
ist ein Polygon-Mesh, das eine Oberflächenrekonstruktion der Straßengeometrie darstellt.
Jede ArMesh
enthält einen Vertex- und einen Index-Buffer:
ArMesh_getVertexListSize()
Ruft die Anzahl der Eckpunkte in diesem Mesh ab.ArMesh_getVertexList()
Die zusammenhängenden Positionen der Mesh-Eckpunkte in Koordinaten relativ zuArStreetscapeGeometry_getMeshPose()
abrufen.ArMesh_getIndexListSize()
Ruft die Anzahl der Indexe in diesem Mesh ab.ArMesh_getIndexList()
Indexe der Eckpunkte abrufen, die ein Gesicht bilden.
AR-Inhalte an eine ArStreetscapeGeometry
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
ArTrackable_acquireNewAnchor()
, um einen Anker in einer bestimmten Pose zu erstellen, der an einemArStreetscapeGeometry
angehängt ist. Der Tracking-Status dieses Ankers wird vom übergeordneten ElementArStreetscapeGeometry
übernommen.
Führen Sie einen Treffertest für ArStreetscapeGeometry
durch.
ArFrame_hitTest
kann für einen Treffertest mit der Straßenraumgeometrie verwendet werden. Wenn Überschneidungen gefunden werden, enthält ArHitResult
Informationen zur Pose am Auftreffpunkt sowie einen Verweis auf die ArStreetscapeGeometry
, die getroffen wurde. Diese Straßenansichtsgeometrie kann an ArTrackable_acquireNewAnchor()
übergeben werden, um einen daran angehängten Anker zu erstellen.
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);
Geospatial Depth aktivieren
Geospatial Depth kombiniert die Geometrie von Straßenzügen mit lokalen Sensoreingaben, 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.