Utilisez les bâtiments et le relief qui vous entourent dans Unity

Les API Streetscape Geometry fournissent la géométrie du terrain, des bâtiments ou d'autres structures d'une scène. La géométrie peut être utilisée pour l'occlusion, le rendu ou le placement de contenu RA via des API de test de collision. Les données de géométrie du paysage urbain sont obtenues à partir des 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. Pour configurer l'API Geospatial, suivez les instructions de la section Activer l'API Geospatial.

Activer la géométrie de paysage urbain

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 de paysage urbain dans une session ARCore

Ajoutez un composant ARStreetscapeGeometryManager à un GameObject. Lorsque des géométries de paysage urbain 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:

Niveau de détail 1 du bâtiment

BuildingLOD1 se compose de surfaces au sol de bâtiments extrudées vers le haut jusqu'à un sommet plat. Les hauteurs des bâtiments peuvent être inexactes.

Niveau de détail 2 du bâtiment

BuildingLOD2 aura une géométrie plus fidèle. Les murs et les toits en réseau maillé correspondent plus précisément à la forme du bâtiment. Les éléments plus petits, comme les cheminées ou les bouches d'aération du toit, peuvent toujours dépasser du maillage.

Comprendre Mesh

Mesh est un maillage polygonal représentant une reconstruction de surface de la géométrie du paysage urbain. Consultez Mesh et MeshRenderer. Notez que les normales ne sont pas calculées par défaut. Pour les calculer, consultez Mesh.RecalculateNormals().

Joindre du contenu RA à un ARStreetscapeGeometry

Utilisez ARAnchorManager.AddAnchor() pour créer un ancrage à une pose donnée à proximité de sommets dans ARStreetscapeGeometry.mesh. Cet ancrage 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 un test de positionnement sur la géométrie du paysage urbain. Si des intersections sont détectées, XRRaycastHit contient des informations sur la pose concernant l'emplacement de la collision, ainsi qu'une référence à l'élément ARStreetscapeGeometry qui a été touché. Cette géométrie Streetscape peut être transmise à ARAnchorManager.AddAnchor() pour créer un ancrage qui y est associé.

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

Geospatial Depth combine Streetscape Geometry avec l'entrée des capteurs locaux pour améliorer les données de profondeur. Lorsque Geospatial Depth est activé, la profondeur de sortie et les images de profondeur brutes sont modifiées pour inclure la géométrie du paysage urbain échantillonnée en plus de la profondeur observée localement. Cela peut améliorer la précision des poses avec la profondeur.