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

Interfejsy Streetscape Geometry API zapewniają geometrię terenu, budynków i innych obiektów w scenie. Geometrii można używać do przesłonięcia, renderowania i umieszczania treści AR za pomocą interfejsów API do testów trafień. Dane geometryczne Streetscape uzyskuje się ze zdjęć Google Street View.

Zobacz fragment

Przykładowa aplikacja do geoprzestrzeni pokazuje, jak uzyskać i wyrenderować geometrie Streetscape.

Konfigurowanie interfejsu Geospatial API

Aby korzystać z funkcji Streetscape Geometry, musisz skonfigurować w projekcie interfejs Geospatial API. Aby skonfigurować interfejs Geospatial API, postępuj zgodnie z instrukcjami włączania interfejsu Geospatial API.

Włącz geometrię Streetscape

Interfejs Geospatial API pobiera dane Streetscape Geometry, gdy GeospatialMode ma wartość GeospatialMode.Enabled, a StreetscapeGeometryMode jest ustawiona na StreetscapeGeometryMode.Enabled.

Uzyskiwanie geometrii Streetscape w sesji ARCore

Dodaj komponent ARStreetscapeGeometryManager do elementu GameObject. Kiedy Geometrie Streetscape są dodawane, aktualizowane lub usuwane, a potem wywoływane jest 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;
}

Informacje o ARStreetscapeGeometry

ARStreetscapeGeometry zawiera informacje o budynku:

Budynek – LOD 1

BuildingLOD1 to kontury budynków rozciągnięte w górę na płaskie dach. Wysokość budynków może być niedokładna.

Budynek LOD 2

BuildingLOD2 będzie mieć wyższą dokładność geometrii. Ściany z siatki i dachy będą lepiej dopasowane do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory dachowe, mogą nadal pojawiać się na zewnątrz siatki.

Informacje o Mesh

Mesh to wielokątna siatka reprezentująca zrekonstruowaną powierzchnię geometrii Streetscape. Zobacz Mesh i MeshRenderer. Pamiętaj, że normy nie są obliczane domyślnie. zobacz Mesh.RecalculateNormals(), aby je obliczyć.

Załączanie treści AR do ARStreetscapeGeometry

Użyj narzędzia ARAnchorManager.AddAnchor(), aby utworzyć reklamę zakotwiczoną w danej pozycji przy wierzchołkach komponentu ARStreetscapeGeometry.mesh. Ta kotwica odziedziczy stan śledzenia z elementu nadrzędnego ARStreetscapeGeometry.

Przeprowadź test trafień na ARStreetscapeGeometry

ARRaycastManagerExtensions.RaycastStreetscapeGeometry może służyć do testowania trafień pod kątem geometrii Streetscape. Po znalezieniu przecięć parametr XRRaycastHit zawiera informacje o położeniu dotyczące lokalizacji działania oraz odwołanie do trafienia ARStreetscapeGeometry. Tę geometrię Streetscape można przekazać do obiektu ARAnchorManager.AddAnchor(), aby utworzyć dołączoną 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łącz głębię geoprzestrzenną

Głębokość geoprzestrzenna łączy geometrię Streetscape z lokalnym czujnikiem w celu ulepszenia danych o głębi. Gdy włączona jest funkcja Głębokość geoprzestrzenna, Obrazy głębi wyjściowej i nieprzetworzonej głębi są modyfikowane tak, by oprócz lokalnie obserwowanej głębi uwzględnić zrasteryzowaną geometrię Streetscape. Może to poprawić dokładność pozycji z wykorzystaniem głębi.