Las APIs de Streetscape Geometry proporcionan la geometría del terreno, los edificios y otras estructuras en una escena. La geometría se puede usar para la oclusión, la renderización o la colocación de contenido de RA con APIs de prueba 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 las 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 para habilitar la API de Geospatial para configurarla.
Habilitar la geometría del paisaje urbano
La API de Geospatial obtiene los 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 componenteARStreetscapeGeometryManager
a un GameObject
. Cuándo
Si se agregan, actualizan o quitan las geometrías del paisaje urbano, 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:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifica StreetscapeGeometry como terreno o edificio. -
ARStreetscapeGeometry.mesh
Obtén un polígonoMesh
que corresponda a este terreno o edificio. -
ARStreetscapeGeometry.quality
Proporciona la calidad de los datos de malla. Los niveles de detalle se describen en el estándar CityGML 2.0.
Nivel de detalle 1 del edificio
BuildingLOD1
consiste en situaciones de edificios extruidas hacia arriba hasta una superficie plana. La altura del edificio puede no ser precisa.
Nivel de detalle 2 del edificio
BuildingLOD2
tendrá una geometría de mayor fidelidad. Las paredes y los techos de malla coincidirán mejor con la forma del edificio. Es posible que las funciones más pequeñas, como chimeneas o respiraderos del techo, sobresalgan fuera de la malla.
Información sobre Mesh
Mesh
es una malla de polígonos que representa una reconstrucción de la 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.
Adjunta 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 en ARStreetscapeGeometry
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
se puede usar para realizar pruebas de posicionamiento con la geometría del paisaje urbano. Si se encuentran intersecciones, XRRaycastHit
contiene información de pose sobre la ubicación del hit y una referencia a ARStreetscapeGeometry
que recibió el hit. 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);
}
}
Cómo habilitar la profundidad geoespacial
La profundidad geoespacial combina la geometría del paisaje urbano. con entradas de sensores locales para mejorar los datos de profundidad. Cuando la profundidad geoespacial está habilitada, las imágenes de profundidad y profundidad sin procesar de salida se modifican para incluir la geometría del paisaje urbano rasterizado además de la profundidad observada a nivel local. Esto puede mejorar la precisión de las poses con la profundidad.