Die Streetscape Geometry APIs stellen die Geometrie von Gelände, Gebäuden oder anderen Strukturen in einer Szene zur Verfügung. Die Geometrie kann zum Verdecken, Rendern oder Platzieren von AR-Inhalten über Hit-Test-APIs verwendet werden. Die Geometriedaten für Streetscape werden über Google Street View-Bilder abgerufen.
Beispiel ausprobieren
Mit der Beispiel-App für raumbezogene Daten wird demonstriert, wie Streetscape-Geometrien abgerufen und gerendert werden.
Geospatial API einrichten
Wenn Sie Streetscape Geometry 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.
Streetscape-Geometrie aktivieren
Die Geospatial API ruft Streetscape Geometry-Daten 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. Wann?
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;
}
Informationen zu ARStreetscapeGeometry
ARStreetscapeGeometry
enthält Informationen zu einem Gebäude:
-
ARStreetscapeGeometry.streetscapeGeometryType
Kennzeichnet die StreetscapeGeometry entweder als Gelände oder als Gebäude. -
ARStreetscapeGeometry.mesh
Erstellen Sie ein PolygonMesh
, das diesem Gelände oder Gebäude entspricht. -
ARStreetscapeGeometry.quality
Liefert die Qualität der Mesh-Daten. Die Detailebenen werden im CityGML 2.0-Standard beschrieben.
LOD 1 wird erstellt
BuildingLOD1
besteht aus Gebäudegrundrissen, die nach oben zu einer flachen Oberseite extrudiert sind. Die Gebäudehöhen können ungenau sein.
LOD 2 wird erstellt
BuildingLOD2
hat eine höhere Geometrie. Gitterwände und -dächer passen sich der Form des Gebäudes besser an. Kleinere Elemente wie Schornsteine oder Dachlüfter führen möglicherweise noch außerhalb des Netzes.
Informationen zu Mesh
Mesh
ist ein Polygonnetz, das eine Rekonstruktion der Oberfläche der Streetscape-Geometrie darstellt.
Weitere Informationen finden Sie unter Mesh
und MeshRenderer
. Beachten Sie, dass die Normalwerte nicht standardmäßig berechnet werden.
siehe Mesh.RecalculateNormals()
, um sie zu berechnen.
AR-Inhalte an ein ARStreetscapeGeometry
anhängen
Verwenden Sie ARAnchorManager.AddAnchor()
, um einen Anker an einer bestimmten Position in der Nähe von Eckpunkten in ARStreetscapeGeometry.mesh
zu erstellen. Dieser Anker übernimmt seinen Tracking-Status vom übergeordneten Element ARStreetscapeGeometry
.
Treffertest für ARStreetscapeGeometry
durchführen
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
kann für Treffertests für die Streetscape-Geometrie verwendet werden. Wenn Kreuzungen gefunden werden, enthält XRRaycastHit
Positionsinformationen zur Trefferposition sowie einen Verweis auf das ARStreetscapeGeometry
-Element, das getroffen wurde. Diese Streetscape-Geometrie kann an ARAnchorManager.AddAnchor()
übergeben werden, um einen 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);
}
}
Raumbezogene Tiefe aktivieren
Räumlich-geografische Tiefe kombiniert Streetscape-Geometrie mit lokalen Sensoreingaben, um die Tiefendaten zu verbessern. Wenn „Raumbezogene Tiefe“ aktiviert ist, Die Ausgabetiefe und die unformatierten Tiefenbilder werden so modifiziert, dass sie zusätzlich zur lokal erfassten Tiefe auch eine gerasterte Streetscape-Geometrie enthalten. Dadurch kann die Genauigkeit von Posen mit „Tiefe“ verbessert werden.