Les API Streetscape Geometry fournissent la géométrie du relief, des bâtiments ou d'autres structures dans une scène. La géométrie peut être utilisée pour l'occlusion, l'affichage ou le placement de contenu en RA via des API de test de positionnement. Les données Streetscape Geometry sont obtenues grâce aux images Google Street View.
Essayer l'exemple
L'application exemple Geospatial montre comment obtenir et afficher des géométries de paysage urbain.
Configurer l'API Geospatial
Pour utiliser Streetscape Geometry, vous devez configurer l'API Geospatial dans votre projet. Suivez les instructions de la section Activer l'API Geospatial pour configurer l'API Geospatial.
Activer Streetscape Geometry
L'API Geospatial obtient des données Streetscape Geometry lorsque GeospatialMode
est défini sur GeospatialMode.Enabled
et StreetscapeGeometryMode
est défini sur StreetscapeGeometryMode.Enabled
.
Obtenir Streetscape Geometry dans une session ARCore
Ajoutez un composantARStreetscapeGeometryManager
à un élément GameObject
. Lorsque des géométries de paysages urbains sont ajoutées, mises à jour ou supprimées, l'événement ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
est déclenché.
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;
}
Comprendre ARStreetscapeGeometry
ARStreetscapeGeometry
contient des informations sur un bâtiment:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifie la StreetscapeGeometry en tant que relief ou en tant que bâtiment. -
ARStreetscapeGeometry.mesh
Obtenez un polygoneMesh
correspondant à ce relief ou ce bâtiment. -
ARStreetscapeGeometry.quality
Fournit la qualité des données du maillage. Les niveaux de détail sont décrits dans la norme CityGML 2.0.
Bâtiment LOD 1
Le BuildingLOD1
consiste en une empreinte de pas de bâtiment extrudée vers le haut vers une surface plane. La hauteur des bâtiments peut être inexacte.
Le LOD du bâtiment 2
BuildingLOD2
aura une géométrie de plus grande fidélité. Les murs et les toits recouverts de maillages correspondront mieux à la forme du bâtiment. Les éléments de petite taille, comme les cheminées ou les ouvertures de toit, peuvent toujours apparaître à l'extérieur de la grille.
Comprendre Mesh
Mesh
est un maillage polygonal représentant une reconstitution de surface de la géométrie du paysage urbain.
Voir Mesh
et MeshRenderer
. Notez que les normales ne sont pas calculées par défaut. Consultez la section Mesh.RecalculateNormals()
pour les calculer.
Joindre du contenu RA à un ARStreetscapeGeometry
Utilisez ARAnchorManager.AddAnchor()
pour créer une ancre à une position donnée près des sommets dans ARStreetscapeGeometry.mesh
. Cette ancre héritera de son état de suivi de l'élément parent ARStreetscapeGeometry
.
Effectuer un test de positionnement sur ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
permet d'effectuer des tests sur Streetscape Geometry. Si des intersections sont détectées, XRRaycastHit
contient des informations sur l'emplacement de l'appel, ainsi qu'une référence au ARStreetscapeGeometry
qui a été appelé. Cette géométrie de paysage Streetscape peut être transmise à ARAnchorManager.AddAnchor()
pour créer une ancre.
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);
}
}
Activer Geospatial Depth
La fonctionnalité Geospatial Depth combine la géométrie du paysage urbain avec les données d'entrée des capteurs locaux pour améliorer les données de profondeur. Lorsque Geospatial Depth est activé, les images de profondeur de sortie et de profondeur brutes sont modifiées pour inclure la géométrie du paysage urbain rastérisée en plus de la profondeur observée localement. Cela peut améliorer la précision des postures en utilisant la profondeur.