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

Interfejsy API Streetscape Geometry udostępniają geometrię terenu, budynków i innych struktur w scenie. Geometria może służyć do zasłonięcia, renderowania lub umieszczania treści AR za pomocą interfejsów hit-test API. Dane geometryczne dotyczące ulicy są uzyskiwane na podstawie zdjęć Google Street View.

Wypróbuj przykład

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

Konfigurowanie interfejsu Geospatial API

Aby korzystać z geometrii Streetscape, musisz skonfigurować interfejs Geospatial API w projekcie. Aby skonfigurować interfejs Geospatial API, wykonaj instrukcje Włączanie interfejsu Geospatial API.

Włączanie geometrii Streetscape

Interfejs Geospatial API uzyskuje dane geometrii Streetscape, gdy parametr GeospatialMode ma wartość GeospatialMode.Enabled, a parametr StreetscapeGeometryMode ma wartość StreetscapeGeometryMode.Enabled.

Pobieranie geometrii Streetscape w sesji ARCore

Dodaj komponent ARStreetscapeGeometryManager do GameObject. Gdy geometrie streetscape są dodawane, aktualizowane lub usuwane, jest wywoływane zdarzenie 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;
}

ARStreetscapeGeometry

ARStreetscapeGeometry zawiera informacje o budynku:

Budynek LOD 1

BuildingLOD1 składa się z wypukłych rzutów poziomych budynku. Wysokość budynków może być niedokładna.

Budynek LOD 2

BuildingLOD2 będzie mieć geometrię o wyższej jakości. Siatka na ścianach i dachach będzie lepiej dopasowana do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory wentylacyjne w dachu, mogą wystawać poza siatkę.

Mesh

Mesh to siatka wielokątów reprezentująca odtworzenie powierzchni geometrii ulicy. Zobacz MeshMeshRenderer. Pamiętaj, że domyślnie normalne nie są obliczane. Aby je obliczyć, użyj funkcji Mesh.RecalculateNormals().

Załączanie treści AR do ARStreetscapeGeometry

Użyj ARAnchorManager.AddAnchor(), aby utworzyć kotwicę w danej pozycji w pobliżu wierzchołków w ARStreetscapeGeometry.mesh. Ten kotwnik odziedziczy stan śledzenia z poziomu elementu nadrzędnego ARStreetscapeGeometry.

Przeprowadź test trafień w przypadku ARStreetscapeGeometry

ARRaycastManagerExtensions.RaycastStreetscapeGeometry można użyć do przetestowania dopasowania do geometrii Streetscape. Jeśli znaleziono punkty przecięcia, XRRaycastHit zawiera informacje o miejscu uderzenia oraz odniesienie do ARStreetscapeGeometry, które zostało uderzone. Geometrię ulicy można przekazać do ARAnchorManager.AddAnchor(), aby utworzyć do niej dołączoną 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łączanie głębi danych geograficznych

Głębia geoprzestrzenna łączy geometrię Streetscape z danymi z lokalnych czujników, aby poprawić dane o głębi. Gdy włączona jest opcja Głębia geoprzestrzenna, obrazy głębi wyjściowej i surowej głębi są modyfikowane, aby zawierały rastrową geometrię Streetscape, a nie tylko lokalnie obserwowaną głębię. Może to poprawić dokładność wykrywania póz przy użyciu Depth.