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 Beispiel-App für Geodaten 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.
Street View-Geometrie in einer ARCore-Sitzung abrufen
Fügen Sie einemGameObject
eine Komponente vom Typ ARStreetscapeGeometryManager
hinzu. Wenn Straßenraumgeometrien hinzugefügt, aktualisiert oder entfernt werden, wird das Ereignis ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
ausgelöst.
public Material streetscapeGeometryMaterial;
List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
public void OnEnable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
GetStreetscapeGeometry;
}
public void Update() {
foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
{
GameObject renderObject = new GameObject(
"StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));
if (renderObject)
{
renderObject.transform.position = streetscapegeometry.pose.position;
renderObject.transform.rotation = streetscapegeometry.pose.rotation;
renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
}
}
}
public void OnDisable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
GetStreetscapeGeometry;
}
private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
_addedStreetscapeGeometries = eventArgs.Added;
_updatedStreetscapeGeometries = eventArgs.Updated;
_removedStreetscapeGeometries = eventArgs.Removed;
}
ARStreetscapeGeometry
ARStreetscapeGeometry
enthält Informationen zu einem Gebäude:
-
ARStreetscapeGeometry.streetscapeGeometryType
Gibt an, ob die StreetscapeGeometry als Gelände oder Gebäude gekennzeichnet ist. -
ARStreetscapeGeometry.mesh
Ermitteln Sie ein PolygonMesh
, das diesem Gelände oder Gebäude entspricht. -
ARStreetscapeGeometry.quality
Gibt die Qualität der Mesh-Daten an. Detailebenen werden im CityGML 2.0-Standard beschrieben.
Gebäude – LOD 1
BuildingLOD1
besteht aus Gebäudegrundrissen, die nach oben zu einer flachen Oberseite extrudiert wurden. Gebäudehöhen können ungenau sein.
Gebäude-LOD 2
BuildingLOD2
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.
Weitere Informationen finden Sie unter Mesh
und MeshRenderer
. Die Normalen werden nicht standardmäßig berechnet. Weitere Informationen finden Sie unter Mesh.RecalculateNormals()
.
AR-Inhalte an eine ARStreetscapeGeometry
anhängen
Verwenden Sie ARAnchorManager.AddAnchor()
, um einen Anker in einer bestimmten Pose in der Nähe von Eckpunkten in ARStreetscapeGeometry.mesh
zu erstellen. Der Tracking-Status dieses Ankers wird vom übergeordneten Element ARStreetscapeGeometry
übernommen.
Führen Sie einen Treffertest für ARStreetscapeGeometry
durch.
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
kann für einen Treffertest mit der Straßenraumgeometrie verwendet werden. Wenn Überschneidungen gefunden werden, enthält XRRaycastHit
Informationen zur Pose am Auftreffpunkt sowie einen Verweis auf die ARStreetscapeGeometry
, die getroffen wurde. Diese Straßenansichtsgeometrie kann an ARAnchorManager.AddAnchor()
übergeben werden, um einen daran angehängten Anker zu erstellen.
Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
ARStreetscapeGeometry streetscapegeometry =
StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
if (streetscapegeometry != null)
{
ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
}
}
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.