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 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 dachu, mogą wystawać poza siatkę.
Mesh
Mesh
to wielokątna siatka reprezentująca odtworzenie powierzchni geometrii ulicy.
Zapoznaj się z artykułami Mesh
i MeshRenderer
. 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.