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

Interfejsy API geometrii Streetscape udostępniają geometrię terenu, budynków lub innych obiektów na scenie. Geometria może służyć do zasłonięcia, renderowania lub umieszczania treści AR za pomocą interfejsów API testowania kolizji. Dane geometryczne Streetscape 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 swoim 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, które kończą się płaskim szczytem. 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 dachu, mogą wystawać poza siatkę.

Mesh

Mesh to wielokątna siatka reprezentująca odtworzenie powierzchni geometrii ulicy. Zapoznaj się z artykułami MeshMeshRenderer. Pamiętaj, że wektory normalne nie są obliczane domyślnie. Aby je obliczyć, zobacz Mesh.RecalculateNormals().

Dołą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 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 docelowym oraz odniesienie do ARStreetscapeGeometry, które zostało znalezione. Geometria ulicy może zostać przekazana do ARAnchorManager.AddAnchor(), aby utworzyć do niej 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 geoprzestrzennej

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.