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 API testowania kolizji. 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 dotyczące włączania 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ę ulicy 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, 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 w dachu, mogą wystawać poza siatkę.
Mesh
Mesh
to wielokątna siatka 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 uderzenie. 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 uwzględnić rastrową geometrię Streetscape, a nie tylko lokalnie obserwowaną głębię. Może to poprawić dokładność wykrywania póz przy użyciu Depth.