Las anclas geoespaciales son un tipo de ancla que te permiten colocar contenido 3D en el mundo real.
Tipos de anclas geoespaciales
Existen tres tipos de anclas geoespaciales, cada una de las cuales controla la altitud de forma diferente:
Anclajes WGS84:
Los anclas WGS84 te permiten colocar contenido en 3D en cualquier latitud, longitud y altitud.Anclas de terreno:
Las anclas de terreno te permiten colocar contenido solo con latitud y longitud con una altura en relación con el terreno en esa posición. La altitud se determina en relación con el suelo o la planta, como lo conoce el VPS.Anclas de techo:
Las anclas de techo te permiten colocar contenido solo con la latitud y la longitud con una altura relativa a la azotea de un edificio en esa posición. La altitud se determina en relación con la parte superior de un edificio, como se conoce en la Geometría del paisaje urbano. De forma predeterminada, se establecerá la altitud del terreno cuando no se coloque en un edificio.
WGS84 | Terreno | Para techo | |
---|---|---|---|
Posición horizontal | Latitud y longitud | Latitud y longitud | Latitud y longitud |
Posición vertical | En relación con la altitud WGS84 | En relación con el nivel del terreno determinado por Google Maps | En relación con el nivel de la azotea determinado por Google Maps |
¿Se debe resolver en el servidor? | No | Sí | Sí |
Requisitos previos
Asegúrate de habilitar la API de Geospatial antes de continuar.
Coloca anclas geoespaciales
Cada tipo de ancla tiene APIs dedicadas para crearlas. Consulta Tipos de anclas geoespaciales para obtener más información.
Crea un ancla a partir de una prueba de posicionamiento
También puedes crear un ancla geoespacial a partir de un resultado de prueba de hit.
Usa la postura de la prueba de posicionamiento y conviértela en una GeospatialPose
. Úsala para colocar cualquiera de los 3 tipos de anclas que se describieron.
Cómo obtener una pose geoespacial a partir de una pose de RA
AREarthManager.Convert(Pose)
proporciona una forma adicional de determinar la latitud y la longitud convirtiendo una posición de RA en una posición geoespacial.
Obtén una postura de RA a partir de una postura geoespacial
AREarthManager.Convert(GeospatialPose)
convierte la posición horizontal, la altitud y la rotación de cuaterniones especificadas por la Tierra con respecto a un marco de coordenadas de este a arriba en una postura de RA con respecto a las coordenadas mundiales de GL.
Elige el método que se adapte a tu caso de uso
Cada método de creación de un ancla tiene compensaciones asociadas que se deben tener en cuenta:
- Cuando uses la geometría del paisaje urbano, realiza una prueba de posicionamiento para adjuntar contenido a un edificio.
- Prefiere los anclas de terreno o techos en lugar de los anclas WGS84, ya que usan valores de altitud determinados por Google Maps.
Determina la latitud y la longitud de una ubicación
Existen tres formas de calcular la latitud y la longitud de una ubicación:
- Usa Geospatial Creator para ver y mejorar el mundo con contenido 3D sin tener que ir físicamente a una ubicación. Esto te permite colocar contenido envolvente en 3D de forma visual con mapas de Google Maps en Unity Editor. La latitud, la longitud, la rotación y la altitud del contenido se calcularán automáticamente.
- Usar Google Maps
- Usa Google Earth. Ten en cuenta que si obtienes estas coordenadas con Google Earth, en lugar de hacerlo con Google Maps, obtendrás un margen de error de hasta varios metros.
- Ve a la ubicación física
Usar Google Maps
Para obtener la latitud y longitud de una ubicación con Google Maps, sigue estos pasos:
Ve a Google Maps en tu computadora de escritorio.
Navega a Capas > Más.
Cambia el Tipo de mapa a Satélite y anula la casilla de verificación Vista de globo en la esquina inferior izquierda de la pantalla.
Esto forzará una perspectiva 2D y eliminará los posibles errores que podrían provenir de una vista en 3D en ángulo.
En el mapa, haz clic con el botón derecho en la ubicación y selecciona la longitud o latitud para copiarlas en el portapapeles.
Cómo usar Google Earth
Para calcular la latitud y la longitud de una ubicación desde Google Earth, haz clic en una ubicación de la IU y lee los datos de los detalles del marcador de posición.
Para obtener la latitud y la longitud de una ubicación con Google Earth, sigue estos pasos:
Ve a Google Earth en la computadora de escritorio.
Navega al menú de opciones y selecciona Diseño de mapa.
Desactiva el interruptor Edificios 3D.
Después de desactivar el interruptor Edificios 3D, haz clic en el ícono de fijar para agregar un marcador en la ubicación seleccionada.
Especifica un proyecto para que contenga tu marcador y haz clic en Guardar.
En el campo Título del marcador, ingresa un nombre para él.
Haz clic en la flecha hacia atrás en el panel del proyecto y selecciona el menú Más acciones.
Elige Exportar como archivo KML en el menú.
El archivo KLM informa la latitud, la longitud y la altitud de un marcador de posición en la etiqueta <coordinates>
, separados por comas, de la siguiente manera:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
No uses la latitud y la longitud de las etiquetas <LookAt>
, que especifican la posición de la cámara, no la ubicación.
Ve a la ubicación física
Para calcular la altitud de una ubicación, ve allí físicamente y realiza una observación local.
Obtén el cuaternion de rotación
GeospatialPose.EunRotation
extrae la orientación de una posición geoespacial y genera un cuaternión que representa la matriz de rotación que transforma un vector del objetivo al sistema de coordenadas este-arriba (EUN). X+ apunta al este, Y+ apunta hacia arriba en dirección opuesta a la gravedad y Z+ apunta al norte.
Anclas WGS84
Un ancla WGS84 es un tipo de anclaje que te permite colocar contenido 3D en cualquier latitud, longitud y altitud determinadas. Se basa en una postura y en la orientación para colocarse en el mundo real. La posición consta de una latitud, una longitud y una altitud, que se especifican en el sistema de coordenadas WGS84. La orientación consiste en una rotación de cuaternión.
La altitud se informa en metros sobre el elipsoide de referencia WGS84, de modo que el nivel del suelo no sea cero. Tu app es responsable de proporcionar estas coordenadas para cada ancla creada.
Coloca un ancla WGS84 en el mundo real
Cómo determinar la altitud de una ubicación
Existen varias formas de determinar la altitud de una ubicación para colocar anclas:
- Si la ubicación del ancla está físicamente cerca del usuario, puedes usar una altitud similar a la del dispositivo del usuario.
- Una vez que tengas la latitud y la longitud, usa la API de Elevation para obtener una elevación basada en la especificación EGM96. Debes convertir la elevación EGM96 de la API de Maps a WGS84 para compararla con la altitud de
GeospatialPose
. Consulta GeoidEval, que tiene una línea de comandos y una interfaz HTML. La API de Google Maps presenta los valores de latitud y longitud según la especificación WGS84. - Puedes consultar la latitud, la longitud y la altitud de una ubicación en Google Earth. Esto te dará un margen de error de hasta varios metros. Usa la latitud, la longitud y la altitud de las etiquetas
<coordinates>
, no las etiquetas<LookAt>
, en el archivo KML. - Si hay un ancla existente cerca y no estás en una pendiente pronunciada, es posible que puedas usar la altitud de
GeospatialPose
de la cámara sin usar otra fuente, como la API de Maps.
Crea el ancla
Una vez que tengas la latitud, la longitud, la altitud y el cuaternion de rotación, usa ARAnchorManagerExtensions.AddAnchor()
para fijar el contenido a las coordenadas geográficas que especifiques.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
Anclajes de terreno
Un ancla de terreno es un tipo de ancla que te permite colocar objetos de RA solo con la latitud y la longitud, aprovechando la información de los VPS para encontrar la altitud precisa sobre el suelo.
En lugar de ingresar la altitud deseada, debes proporcionar la altitud sobre el terreno. Cuando el valor sea cero, el ancla estará nivelada con el terreno.
Configura el modo de búsqueda de aviones
El hallazgo de planos es opcional y no es necesario para usar anclas. Ten en cuenta que solo se usan planos horizontales. Los planos horizontales ayudarán a la alineación dinámica de las anclas de terreno en el suelo.
Ten en cuenta que los anclajes de terreno se ven afectados por Horizontal
y Horizontal | Vertical
.
Usa el menú desplegable Modo de detección para establecer el modo de detección:
Crea un ancla de terreno con la nueva API de Async
Para crear y colocar un ancla de terreno, llama a ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
.
El ancla no estará lista de inmediato y debe resolverse. Una vez que se resuelva, estará disponible en ResolveAnchorOnTerrainPromise
.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Verifica el estado de la promesa
La promesa tendrá un PromiseState
asociado.
Estado | Descripción |
---|---|
Pending |
La operación aún está pendiente. |
Done |
La operación se completó y el resultado está disponible. |
Cancelled |
Se canceló la operación. |
Verifica el estado de la ancla de terreno del resultado de Promise
El TerrainAnchorState
pertenece a la operación asíncrona y es parte del resultado final de la promesa.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
Anclajes para techos
Los anclajes de techo son un tipo de anclaje y son muy similares a los anclajes de terreno mencionados anteriormente. La diferencia es que debes proporcionar la altitud sobre la azotea en lugar de la altitud sobre el terreno.
Crea un ancla de techo con la nueva API de Async
El ancla no estará lista de inmediato y debe resolverse.
Para crear y colocar un ancla de techo, llama a ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
. Al igual que con las anclas de terreno, también accederás a PromiseState
de la promesa. Luego, puedes verificar el resultado de la promesa para acceder a RooftopAnchorState
.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Verifica el estado de la promesa
La promesa tendrá un PromiseState
asociado. Consulta la tabla anterior.
Verifica el estado de la ancla de techo del resultado de Promise
RooftopAnchorState
pertenece a la operación asíncrona y forma parte del resultado final de Promise.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
¿Qué sigue?
- Asegúrate de comprender la cuota de uso de la API de Geospatial.