Les API Streetscape Geometry fournissent la géométrie du relief, des bâtiments ou d'autres structures d'une scène. La géométrie peut être utilisée pour l'occlusion, l'affichage ou le placement de contenu 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 Streetscape Geometries.
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 les données Streetscape Geometry lorsque GeospatialMode
est défini sur GeospatialMode.Enabled
et StreetscapeGeometryMode
sur StreetscapeGeometryMode.Enabled
.
Obtenir une géométrie Streetscape dans une session ARCore
Ajoutez un composantARStreetscapeGeometryManager
à un GameObject
. Quand ?
Les géométries Streetscape Geometies 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 géométrie StreetscapeGeometry en tant que relief ou bâtiment. -
ARStreetscapeGeometry.mesh
Obtenez un polygoneMesh
correspondant à ce relief ou bâtiment. -
ARStreetscapeGeometry.quality
Fournit la qualité des données du réseau maillé. Les niveaux de détail sont décrits dans la norme CityGML 2.0.
Bâtiment LOD 1
BuildingLOD1
correspond à l'empreinte de bâtiment extrudée vers le haut sur une surface plane. La hauteur des bâtiments peut être inexacte.
Bâtiment LOD 2
BuildingLOD2
présente une géométrie plus fidèle. Les murs et les toits en maille se rapprochent de la forme du bâtiment. Les éléments plus petits, comme les cheminées ou les ouvertures de toit, peuvent quand même percer à l'extérieur du maillage.
Comprendre Mesh
Mesh
est un maillage polygonal représentant une reconstruction de la surface de la géométrie Streetscape.
Voir Mesh
et MeshRenderer
. Notez que les normales ne sont pas calculées par défaut.
voir Mesh.RecalculateNormals()
pour les calculer.
Joindre du contenu en RA à un ARStreetscapeGeometry
Utilisez ARAnchorManager.AddAnchor()
pour créer une ancre au niveau d'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
peut être utilisé pour effectuer des tests de positionnement par rapport à la géométrie Streetscape. Si des intersections sont détectées, XRRaycastHit
contient des informations de pose sur le lieu de l'appel, ainsi qu'une référence à la ARStreetscapeGeometry
qui a été appelée. Cette géométrie de paysage Streetscape peut être transmise à ARAnchorManager.AddAnchor()
pour créer une ancre associée.
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 la profondeur géospatiale
Geospatial Depth (Profondeur géospatiale) combine la géométrie Streetscape avec l'entrée d'un capteur local pour améliorer les données de profondeur. Lorsque la profondeur géospatiale est activée, les images de profondeur de sortie et de profondeur brute sont modifiées pour inclure la géométrie Streetscape rastérisée en plus de la profondeur observée localement. Cela peut améliorer la précision des postures en utilisant la profondeur.