Korzystanie z budynków i terenu wokół siebie w Unity

Interfejsy API Streetscape Geometry udostępniają geometrię terenu, budynków i innych obiektów w scenie. Ta geometria może służyć do zasłaniania, renderowania lub umieszczania treści AR za pomocą interfejsów API testów trafień. Dane geometryczne Street View są uzyskiwane ze zdjęć Google Street View.

Skorzystaj z przykładu

Przykładowa aplikacja geoprzestrzenna pokazuje, jak uzyskiwać i renderować geometrie Streetscape.

Konfigurowanie interfejsu Geospatial API

Aby używać Streetscape Geometry, musisz skonfigurować interfejs Geospatial API w swoim projekcie. Aby skonfigurować interfejs Geospatial API, wykonaj instrukcje włączania interfejsu Geospatial API.

Włącz geometrię Streetscape

Interfejs Geospatial API uzyskuje dane ze Streetscape Geometry, gdy element GeospatialMode ma wartość GeospatialMode.Enabled, a StreetscapeGeometryModeStreetscapeGeometryMode.Enabled.

Uzyskiwanie danych geometrycznych ze Streetscape w sesji ARCore

Dodaj komponent ARStreetscapeGeometryManager do GameObject. Dodanie, zaktualizowanie lub usunięcie geometrii Streetscape spowoduje uruchomienie zdarzenia ARStreetscapeGeometryManager.StreetscapeGeometriesChanged.

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;
}

Informacje o ARStreetscapeGeometry

ARStreetscapeGeometry zawiera informacje o budynku:

Budynek – poziom działania 1

BuildingLOD1 to podstawy budynków wystające w górę na płaski dach. Wysokości budynków mogą być niedokładne.

Budynek – poziom działania 2

BuildingLOD2 będzie mieć większą dokładność geometrii. Ściany z siatki i dachy lepiej dopasują się do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory dachowe, mogą nadal wystawiać się poza siatkę.

Informacje o Mesh

Mesh to siatka wielokątów przedstawiająca rekonstrukcję geometrii Streetscape. Zobacz Mesh i MeshRenderer. Pamiętaj, że wartości normalne nie są obliczane domyślnie. Aby je obliczyć, zapoznaj się z sekcją Mesh.RecalculateNormals().

Dołączanie treści AR do obiektu ARStreetscapeGeometry

Użyj narzędzia ARAnchorManager.AddAnchor(), aby utworzyć kotwicę w określonym położeniu w pobliżu wierzchołków w ARStreetscapeGeometry.mesh. Ta kotwica odziedziczy stan śledzenia z elementu nadrzędnego ARStreetscapeGeometry.

Wykonaj test trafień pod adresem ARStreetscapeGeometry

Narzędzia ARRaycastManagerExtensions.RaycastStreetscapeGeometry można używać do testów z użyciem geometrii Streetscape. Jeśli zostaną znalezione skrzyżowania, XRRaycastHit zawiera informacje o pozycji o lokalizacji działania, a także odwołanie do elementu ARStreetscapeGeometry, który został trafiony. Tę geometrię Streetscape możesz przekazać do ARAnchorManager.AddAnchor(), by utworzyć do niej zakotwiczoną kotwicę.

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);
  }
}

Włącz głębokość geoprzestrzenną

Funkcja Głębokość geoprzestrzenna łączy geometrię Streetscape z danymi z lokalnego czujnika w celu ulepszenia danych o głębi. Po włączeniu Głębokości geoprzestrzennej dane wyjściowe i nieprzetworzona głębokość są modyfikowane tak, aby oprócz lokalnie obserwowanej głębi uwzględniały zrastrowane geometrię Streetscape. Może to poprawić dokładność póz z użyciem głębi.