Die Streetscape Geometry APIs liefern die Geometrie von Gelände, Gebäuden oder anderen Strukturen in einer Szene. Die Geometrie kann zum Verdecken, Rendern oder Platzieren von AR-Inhalten über Treffertest-APIs verwendet werden. Die Geometriedaten für Streetscape werden über Google Street View-Bilder abgerufen.
Beispiel ausprobieren
In der Räumlich-Beispiel-App wird gezeigt, wie Streetscape-Geometrien abgerufen und gerendert werden.
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 sie einzurichten.
Streetscape-Geometrie aktivieren
Die Geospatial API ruft Streetscape-Geometriedaten ab, wenn GeospatialMode
auf GeospatialMode.Enabled
und StreetscapeGeometryMode
auf StreetscapeGeometryMode.Enabled
gesetzt ist.
Streetscape-Geometrie in einer ARCore-Sitzung abrufen
Fügen Sie einerGameObject
eine ARStreetscapeGeometryManager
-Komponente hinzu. Wenn Streetscape-Geometrien 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
verstehen
ARStreetscapeGeometry
enthält Informationen zu einem Gebäude:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifiziert StreetscapeGeometry entweder als Gelände oder als Gebäude. -
ARStreetscapeGeometry.mesh
Fordern Sie ein PolygonMesh
an, das dem Gelände oder Gebäude entspricht. -
ARStreetscapeGeometry.quality
Stellt die Qualität der Mesh-Daten bereit. Die Detailebenen werden im CityGML 2.0-Standard beschrieben.
LOD 1 erstellen
BuildingLOD1
besteht aus Gebäuden, die nach oben auf eine flache Oberfläche extrudiert werden. Gebäudehöhen können ungenau sein.
LOD 2 erstellen
BuildingLOD2
weist eine höhere Geometrie auf. Gitterwände und Dächer passen sich besser an die Form des Gebäudes an. Auch kleinere Elemente wie Schornsteine oder Lüftungsöffnungen können aus dem Gitter herausragen.
Mesh
verstehen
Mesh
ist ein Polygonnetz, das eine Oberflächenrekonstruktion der Streetscape-Geometrie darstellt.
Weitere Informationen finden Sie unter Mesh
und MeshRenderer
. Beachten Sie, dass die Normalwerte nicht standardmäßig berechnet werden. Informationen zur Berechnung finden Sie unter Mesh.RecalculateNormals()
.
AR-Inhalte an ARStreetscapeGeometry
anhängen
Erstellen Sie mit ARAnchorManager.AddAnchor()
einen Anker bei einer bestimmten Position nahe den Eckpunkten in ARStreetscapeGeometry.mesh
. Dieser Anker übernimmt den Tracking-Status vom übergeordneten ARStreetscapeGeometry
.
Treffertest für ARStreetscapeGeometry
durchführen
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
kann für Treffertests mit Streetscape-Geometriedaten verwendet werden. Wenn Kreuzungen gefunden werden, enthält XRRaycastHit
Poseninformationen zur Trefferposition sowie einen Verweis auf das ARStreetscapeGeometry
, für das der Treffer getroffen wurde. Diese Streetscape-Geometrie kann an ARAnchorManager.AddAnchor()
übergeben werden, um einen Anker hinzuzufügen.
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);
}
}
Raumbezogene Tiefe aktivieren
Bei der raumbezogenen Tiefe wird die Streetscape-Geometrie mit lokalen Sensoreingaben kombiniert, um Tiefendaten zu verbessern. Wenn die raumbezogene Tiefe aktiviert ist, werden die ausgegebenen Bilder mit Tiefentiefe und Rohtiefe so geändert, dass zusätzlich zur lokal beobachteten Tiefe auch die gerasterte Streetscape-Geometrie enthalten ist. Dadurch kann die Genauigkeit von Posen mithilfe der Tiefe verbessert werden.