Usa los edificios y el terreno a tu alrededor en Unity

Las APIs de geometría del paisaje urbano proporcionan la geometría del terreno, los edificios y otras estructuras de una escena. La geometría se puede usar para la oclusión, la renderización o la colocación de contenido de RA mediante las APIs de pruebas de posicionamiento. Los datos de geometría del paisaje urbano se obtienen a través de las imágenes de Google Street View.

Prueba la muestra

En la app de ejemplo de Geospatial, se muestra cómo obtener y renderizar geometrías del paisaje urbano.

Configura la API de Geospatial

Para usar Streetscape Geometry, deberás configurar la API de Geospatial en tu proyecto. Sigue las instrucciones que se indican en Cómo habilitar la API de Geospatial para configurarla.

Habilitar la geometría del paisaje urbano

La API de Geospatial obtiene datos de Streetscape Geometry cuando GeospatialMode se establece en GeospatialMode.Enabled y StreetscapeGeometryMode se establece en StreetscapeGeometryMode.Enabled.

Obtén la geometría del paisaje urbano en una sesión de ARCore

Agrega un componente ARStreetscapeGeometryManager a una GameObject. Cuando se agregan, actualizan o quitan las geometrías de Streetscape, se activa el 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;
}

Información sobre ARStreetscapeGeometry

ARStreetscapeGeometry: Contiene información sobre un edificio:

Nivel de detalle de edificio 1

El objeto BuildingLOD1 consiste en huellas de edificios extruidas hacia arriba hasta una parte superior plana. Las alturas de los edificios pueden ser imprecisas.

Nivel de detalle de construcción 2

BuildingLOD2 tendrá una geometría de mayor fidelidad. Las paredes y los techos de malla se ajustarán mejor a la forma del edificio. Las características más pequeñas, como las chimeneas o los conductos de ventilación del techo, podrían salir de la malla.

Información sobre Mesh

Mesh es una malla de polígonos que representa una reconstrucción de superficie de la geometría del paisaje urbano. Consulta Mesh y MeshRenderer. Ten en cuenta que las normales no se calculan de forma predeterminada. Consulta Mesh.RecalculateNormals() para calcularlas.

Adjuntar contenido de RA a un ARStreetscapeGeometry

Usa ARAnchorManager.AddAnchor() para crear un ancla en una pose determinada cerca de los vértices en ARStreetscapeGeometry.mesh. Este ancla heredará su estado de seguimiento del elemento superior ARStreetscapeGeometry.

Realiza una prueba de posicionamiento contra ARStreetscapeGeometry

Se puede usar ARRaycastManagerExtensions.RaycastStreetscapeGeometry para realizar pruebas de posicionamiento con la geometría del paisaje urbano. Si se encuentran intersecciones, XRRaycastHit contiene información de la pose sobre la ubicación del hit, así como una referencia a ARStreetscapeGeometry que se alcanzó. Esta geometría del paisaje urbano se puede pasar a ARAnchorManager.AddAnchor() para crear un ancla adjunta.

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);
  }
}

Habilita la profundidad geoespacial

La profundidad geoespacial combina la geometría del paisaje urbano con la entrada del sensor local para mejorar los datos de profundidad. Cuando se habilita la profundidad geoespacial, la profundidad de salida y las imágenes de profundidad sin procesar se modifican para incluir la geometría del paisaje urbano rasterizada, además de la profundidad observada a nivel local. Esto podría mejorar la precisión de las poses usando Depth.