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 komponentARStreetscapeGeometryManager
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:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identyfikuje geometrię uliczną jako teren lub budynek. -
ARStreetscapeGeometry.mesh
Uzyskaj wielokątMesh
odpowiadający temu rodzajowi terenu lub budynkowi. -
ARStreetscapeGeometry.quality
Pozwala określić jakość danych siatki. Poziomy szczegółowości są opisane w standardzie CityGML 2.0.
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 Mesh
i MeshRenderer
. 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.