Le API Streetscape Geometry forniscono la geometria del terreno, degli edifici o di altre strutture in una scena. La geometria può essere utilizzata per l'occlusione, il rendering o il posizionamento di contenuti AR tramite API di hit-test. I dati di Streetscape Geometry vengono ottenuti tramite le immagini di Google Street View.
Prova il Sample
L'app di esempio geospaziale mostra come ottenere e visualizzare le geometrie di Streetscape.
Configurare l'API Geospatial
Per utilizzare la geometria di Streetscape, devi configurare l'API Geospatial nel tuo progetto. Segui le istruzioni per abilitare l'API Geospatial per configurare l'API Geospatial.
Attiva la geometria di Streetscape
L'API Geospatial ottiene i dati di geometria della strada quando GeospatialMode
è impostato su GeospatialMode.Enabled
e StreetscapeGeometryMode
è impostato su StreetscapeGeometryMode.Enabled
.
Ottenere la geometria della strada in una sessione ARCore
Aggiungi un componenteARStreetscapeGeometryManager
a un GameObject
. Quando le Geometries 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;
}
Informazioni su ARStreetscapeGeometry
ARStreetscapeGeometry
contiene informazioni su un edificio:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifica StreetscapeGeometry come terreno o edificio. -
ARStreetscapeGeometry.mesh
Ottieni un poligonoMesh
che corrisponda a questo terreno o edificio. -
ARStreetscapeGeometry.quality
Fornisce la qualità dei dati della mesh. I livelli di dettaglio sono descritti nello standard CityGML 2.0.
LOD dell'edificio 1
BuildingLOD1
è costituito da impronte di edifici estruse verso l'alto fino a una sommità piana. Le altezze degli edifici potrebbero non essere precise.
LOD dell'edificio 2
BuildingLOD2
avrà una geometria con una fedeltà superiore. Le pareti e i tetti mesh si adatteranno meglio alla forma dell'edificio. Elementi più piccoli come camini o prese d'aria sul tetto potrebbero comunque sporgere all'esterno della maglia.
Informazioni su Mesh
Mesh
è una rete poligonale che rappresenta una ricostruzione della superficie della geometria di Street View.
Vedi Mesh
e MeshRenderer
. Tieni presente che i valori normali non vengono calcolati per impostazione predefinita; consulta la pagina Mesh.RecalculateNormals()
per calcolarle.
Allega contenuti AR a un ARStreetscapeGeometry
Utilizza ARAnchorManager.AddAnchor()
per creare un'ancora in una determinata posa vicino ai vertici in ARStreetscapeGeometry.mesh
. Questo ancoraggio erediterà il proprio stato di monitoraggio dall'elemento principale ARStreetscapeGeometry
.
Esegui un test di corrispondenza su ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
può essere utilizzato per eseguire un test di hit rispetto alla geometria di Streetscape. Se vengono trovate intersezioni, XRRaycastHit
contiene informazioni sulla posizione dell'impatto e un riferimento all'ARStreetscapeGeometry
colpito. Questa geometria del paesaggio urbano può essere passata a ARAnchorManager.AddAnchor()
per creare un'ancora collegata.
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);
}
}
Attivare la profondità geospaziale
La funzionalità Profondità geospaziale combina la geometria della strada con l'input dei sensori locali per migliorare i dati sulla profondità. Quando la profondità geospaziale è attivata, le immagini di profondità in uscita e di profondità non elaborata vengono modificate per includere la geometria della strada rasterizzata oltre alla profondità osservata localmente. Ciò può migliorare la precisione delle pose usando la profondità.