Le API Streetscape Geometry forniscono la geometria di terreni, edifici o altre strutture in una scena. La geometria può essere utilizzata per occlusione, rendering o posizionamento di contenuti AR tramite API hit-test. I dati della geometria di Streetscape sono ottenuti tramite le immagini di Google Street View.
Prova l'esempio
L'app di esempio geospaziale mostra come ottenere ed eseguire il rendering delle geometrie di Streetscape.
Configurare l'API Geospatial
Per utilizzare Streetscape Geometry, devi configurare l'API Geospatial nel tuo progetto. Segui le istruzioni su come attivare l'API Geospatial per configurare l'API geospaziale.
Attiva la geometria di Streetscape
L'API Geospatial ottiene i dati di Streetscape Geometry quando GeospatialMode
è impostato su GeospatialMode.Enabled
e StreetscapeGeometryMode
è impostato su StreetscapeGeometryMode.Enabled
.
Ottenere la geometria Streetscape in una sessione ARCore
Aggiungi un componenteARStreetscapeGeometryManager
a GameObject
. Quando
Le geometrie di Streetscape vengono aggiunte, aggiornate o rimosse e 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 un edificio. -
ARStreetscapeGeometry.mesh
Crea un poligonoMesh
corrispondente al terreno o all'edificio in questione. -
ARStreetscapeGeometry.quality
Fornisce la qualità dei dati mesh. I livelli di dettaglio sono descritti nello standard CityGML 2.0.
Edificio livello 1
BuildingLOD1
è costituito da impronte di edifici estruse verso l'alto fino a formare una parte superiore piana. L'altezza degli edifici potrebbe non essere precisa.
Edificio livello 2
BuildingLOD2
avrà una geometria con fedeltà più alta. Le pareti e i tetti in retina si adattano meglio alla forma dell'edificio. Elementi più piccoli come camini o prese d'aria sul tetto potrebbero comunque penetrare all'esterno della rete.
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 Mesh.RecalculateNormals()
per calcolarle.
Allegare contenuti AR a una ARStreetscapeGeometry
Utilizza ARAnchorManager.AddAnchor()
per creare un ancoraggio in una determinata posa vicino ai vertici in ARStreetscapeGeometry.mesh
. Questo ancoraggio erediterà il proprio stato di monitoraggio dall'elemento principale ARStreetscapeGeometry
.
Eseguire un hit-test contro ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
può essere utilizzato per eseguire un test di hit rispetto alla geometria di Streetscape. Se vengono individuati degli incroci, XRRaycastHit
contiene informazioni sulla posa relativamente alla posizione dell'hit, oltre a un riferimento alla ARStreetscapeGeometry
che è stata rilevata. La 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 profondità geospaziale combina la geometria di paesaggi urbani con input dei sensori locali per migliorare i dati sulla profondità. Quando la funzionalità Profondità geospaziale è attivata, le immagini di profondità di output e di profondità non elaborate vengono modificate per includere la geometria di Streetscape rasterizzata oltre alla profondità osservata localmente. Ciò può migliorare la precisione delle pose usando la profondità.