Le API Streetscape Geometry forniscono la geometria del terreno, degli edifici o di altre strutture in una scena. La geometria può essere utilizzata per occlusione, rendering o posizionamento di contenuti AR tramite API di hit test. I dati di Street View Geometry sono ottenuti tramite le immagini di Google Street View.
Prova l'esempio
L'app di esempio geospaziale mostra come ottenere e visualizzare le geometrie di Streetscape.
Configura l'API Geospatial
Per utilizzare Streetscape Geometry, devi configurare l'API Geospatial nel tuo progetto. Segui le istruzioni sull'abilitazione dell'API Geospatial per configurare l'API Geospatial.
Attiva Streetscape Geometry
L'API Geospatial ottiene i dati di Streetscape Geometry quando GeospatialMode
è impostato su GeospatialMode.Enabled
e StreetscapeGeometryMode
è impostato su StreetscapeGeometryMode.Enabled
.
Ottenere Streetscape Geometry in una sessione ARCore
Aggiungi un componenteARStreetscapeGeometryManager
a un elemento GameObject
. Quando
le geometrie di Streetscape vengono aggiunte, aggiornate o rimosse, viene attivato l'evento 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;
}
Comprendi ARStreetscapeGeometry
ARStreetscapeGeometry
contiene informazioni su un edificio:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifica StreetscapeGeometry come terreno o come edificio. -
ARStreetscapeGeometry.mesh
Ottieni un poligonoMesh
corrispondente a questo terreno o edificio. -
ARStreetscapeGeometry.quality
Fornisce la qualità dei dati mesh. I livelli di dettaglio sono descritti nello standard CityGML 2.0.
LOD edificio 1
BuildingLOD1
è costituito da impronte di edifici estruse verso l'alto fino a una sommità piatta. L'altezza degli edifici potrebbe non essere accurata.
LOD edificio 2
BuildingLOD2
avrà una geometria a fedeltà più elevata. Le pareti e i tetti a griglia si avvicinano maggiormente alla forma dell'edificio. Elementi più piccoli, come camini o prese d'aria sul tetto, potrebbero comunque fuoriuscire dalla rete.
Comprendi Mesh
Mesh
è una maglia poligonale che rappresenta una ricostruzione della superficie della Geometria di Streetscape.
Consulta le sezioni Mesh
e MeshRenderer
. Tieni presente che le normali non sono calcolate per impostazione predefinita; vedi Mesh.RecalculateNormals()
per calcolarle.
Collegare contenuti AR a una ARStreetscapeGeometry
Utilizza ARAnchorManager.AddAnchor()
per creare un ancoraggio in una determinata posizione vicino ai vertici in ARStreetscapeGeometry.mesh
. Questo ancoraggio erediterà il proprio stato di monitoraggio dall'elemento ARStreetscapeGeometry
principale.
Esegui un hit test su ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
può essere utilizzato per eseguire test su Streetscape Geometry. Se vengono rilevati degli incroci, XRRaycastHit
contiene informazioni sulla posa sulla posizione dell'hit e un riferimento all'elemento ARStreetscapeGeometry
interessato. Questa geometria di Streetscape può essere passata a ARAnchorManager.AddAnchor()
per creare un ancoraggio collegato.
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);
}
}
Attiva profondità geospaziale
La funzionalità Profondità geospaziale combina Streetscape Geometry con l'input dei sensori locali per migliorare i dati di profondità. Quando la funzionalità Profondità geospaziale è abilitata, le immagini di profondità non elaborate e di output vengono modificate in modo da includere la geometria Streetscape rasterizzata oltre alla profondità osservata localmente. Questa operazione può migliorare la precisione delle pose usando la profondità.