Gebäude und Gelände in der Umgebung auf Unity verwenden

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 einem GameObject 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:

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.