Interfejsy API Streetscape Geometry udostępniają geometrię terenu, budynków i innych obiektów w scenie. Ta geometria może służyć do zasłaniania, renderowania lub umieszczania treści AR za pomocą interfejsów API testów trafień. Dane geometryczne Street View są uzyskiwane ze zdjęć Google Street View.
Skorzystaj z przykładu
Przykładowa aplikacja geoprzestrzenna pokazuje, jak uzyskiwać i renderować geometrie Streetscape.
Konfigurowanie interfejsu Geospatial API
Aby używać Streetscape Geometry, musisz skonfigurować interfejs Geospatial API w swoim projekcie. Aby skonfigurować interfejs Geospatial API, wykonaj instrukcje włączania interfejsu Geospatial API.
Włącz geometrię Streetscape
Interfejs Geospatial API uzyskuje dane ze Streetscape Geometry, gdy element GeospatialMode
ma wartość GeospatialMode.Enabled
, a StreetscapeGeometryMode
– StreetscapeGeometryMode.Enabled
.
Uzyskiwanie danych geometrycznych ze Streetscape w sesji ARCore
Dodaj komponentARStreetscapeGeometryManager
do GameObject
. Dodanie, zaktualizowanie lub usunięcie geometrii Streetscape spowoduje uruchomienie zdarzenia 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:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identyfikuje obiekt StreetscapeGeometry jako teren lub budynek. -
ARStreetscapeGeometry.mesh
Uzyskaj wielokątMesh
odpowiadający temu terenowi lub budynku. -
ARStreetscapeGeometry.quality
Dostarcza jakość danych sieci typu mesh. Poziomy szczegółowości są opisane w standardzie CityGML 2.0.
Budynek – poziom działania 1
BuildingLOD1
to podstawy budynków wystające w górę na płaski dach. Wysokości budynków mogą być niedokładne.
Budynek – poziom działania 2
BuildingLOD2
będzie mieć większą dokładność geometrii. Ściany z siatki i dachy lepiej dopasują się do kształtu budynku. Mniejsze elementy, takie jak kominy czy otwory dachowe, mogą nadal wystawiać się poza siatkę.
Informacje o Mesh
Mesh
to siatka wielokątów przedstawiająca rekonstrukcję geometrii Streetscape.
Zobacz Mesh
i MeshRenderer
. Pamiętaj, że wartości normalne nie są obliczane domyślnie. Aby je obliczyć, zapoznaj się z sekcją Mesh.RecalculateNormals()
.
Dołączanie treści AR do obiektu ARStreetscapeGeometry
Użyj narzędzia ARAnchorManager.AddAnchor()
, aby utworzyć kotwicę w określonym położeniu w pobliżu wierzchołków w ARStreetscapeGeometry.mesh
. Ta kotwica odziedziczy stan śledzenia z elementu nadrzędnego ARStreetscapeGeometry
.
Wykonaj test trafień pod adresem ARStreetscapeGeometry
Narzędzia ARRaycastManagerExtensions.RaycastStreetscapeGeometry
można używać do testów z użyciem geometrii Streetscape. Jeśli zostaną znalezione skrzyżowania, XRRaycastHit
zawiera informacje o pozycji o lokalizacji działania, a także odwołanie do elementu ARStreetscapeGeometry
, który został trafiony. Tę geometrię Streetscape możesz przekazać do ARAnchorManager.AddAnchor()
, by utworzyć do niej zakotwiczoną 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łębokość geoprzestrzenną
Funkcja Głębokość geoprzestrzenna łączy geometrię Streetscape z danymi z lokalnego czujnika w celu ulepszenia danych o głębi. Po włączeniu Głębokości geoprzestrzennej dane wyjściowe i nieprzetworzona głębokość są modyfikowane tak, aby oprócz lokalnie obserwowanej głębi uwzględniały zrastrowane geometrię Streetscape. Może to poprawić dokładność póz z użyciem głębi.