Las APIs de Streetscape Geometry 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 a través de APIs de prueba de colisiones. 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 de paisaje urbano.
Configura la API de Geospatial
Para usar la geometría del paisaje urbano, deberás configurar la API de Geospatial en tu proyecto. Sigue las instrucciones para habilitar la API de Geospatial y configurarla.
Habilita 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 componenteARStreetscapeGeometryManager
a un GameObject
. Cuando se agregan, actualizan o quitan geometrías de 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;
}
Comprende ARStreetscapeGeometry
ARStreetscapeGeometry
contiene información sobre un edificio:
-
ARStreetscapeGeometry.streetscapeGeometryType
Identifica StreetscapeGeometry como un terreno o un 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.
Edificio LOD 1
BuildingLOD1
consta de huellas de edificios extruidas hacia arriba hasta una parte superior plana. Es posible que las alturas de los edificios no sean precisas.
Edificio LOD 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. Es posible que los elementos más pequeños, como las chimeneas o los respiraderos de techo, sobresalgan de la malla.
Comprende 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 los normales no se calculan de forma predeterminada. Consulta Mesh.RecalculateNormals()
para calcularlos.
Cómo adjuntar contenido de RA a un ARStreetscapeGeometry
Usa ARAnchorManager.AddAnchor()
para crear un ancla en una pose determinada cerca de vértices en ARStreetscapeGeometry.mesh
. Este ancla heredará su estado de seguimiento del elemento superior ARStreetscapeGeometry
.
Realiza una prueba de posicionamiento en ARStreetscapeGeometry
.
Se puede usar ARRaycastManagerExtensions.RaycastStreetscapeGeometry
para realizar una prueba de posicionamiento en la geometría del paisaje urbano. Si se encuentran intersecciones, XRRaycastHit
contiene información de pose sobre la ubicación del hit, así como una referencia al ARStreetscapeGeometry
que se golpeó. 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
Geospatial Depth combina Streetscape Geometry con la entrada del sensor local para mejorar los datos de profundidad. Cuando se habilita la profundidad geoespacial, se modifican la profundidad de salida y las imágenes de profundidad sin procesar para incluir la geometría del paisaje urbano rasterizada, además de la profundidad observada localmente. Esto puede mejorar la precisión de las poses con la función Profundidad.