Crea y edita anclas de forma programática en el Creador de Geospatial en Unity

En esta guía, se describe cómo usar Geospatial Creator para escribir secuencias de comandos de C# con el fin de realizar rápidamente tareas comunes, como crear y mover objetos ARGeospatialCreatorAnchor en el modo de edición de Unity. Esto puede ser útil para crear varios anclajes a partir de una lista predefinida, como una hoja de cálculo o un archivo KML.

El Creador de Geospatial en Unity te permite obtener una vista previa del contenido geoespacial en el editor de Unity. En nuestra Guía de inicio rápido, se presenta el Creador de Geospatial y se explica cómo compilar tu primera experiencia de RA habilitada para Geospatial con una programación mínima, a través de la IU del editor de Unity. Para proyectos más avanzados, te recomendamos que crees y manipules los objetos de juego de Geospatial Creator de forma programática en lugar de usar la IU del editor de Unity.

En esta guía, se da por sentado que conoces los conceptos básicos de Geospatial Creator que se presentaron en la guía de inicio rápido y que tienes todo listo para comenzar a agregar anclas de Geospatial Creator a una escena. Deberás tener habilitado y configurado el Creador de Geospatial con tus claves de API, así como los objetos iniciales de la sesión de RA en tu escena. Si comienzas desde cero, sigue la guía de inicio rápido hasta la sección "Habilita a Creator de datos geoespaciales" antes de continuar.

Cómo comenzar

En este ejemplo, supongamos que tienes un conjunto de ubicaciones conocidas alrededor del Ayuntamiento de San Francisco, California, EE.UU., en las que deseas colocar contenido de RA. Deberás crear objetos de ancla en cada una de estas ubicaciones y, luego, adjuntar una geometría básica a esos anclas.

Antes de crear anclas, debes especificar un ARGeospatialCreatorOrigin, que es un punto de referencia para convertir latitudes, longitudes y altitudes desde y hacia las coordenadas mundiales de Unity. El origen también contendrá un subcomponente CesiumGeoreference y un objeto secundario Cesium3DTileset, lo que permite que Cesium renderice el área circundante en la vista de escena del editor de Unity. Para ello, necesitas una clave de API de Google Maps Tiles como se describe en la Guía de inicio rápido.

Crea un origen

La API de Geospatial Creator incluye un método de fábrica para crear un ARGeospatialCreatorOrigin en la escena y agregar los componentes de Cesium necesarios. El siguiente código crea el origen en una latitud, longitud y altitud cercanas, y usa la clave de API de Map Tiles proporcionada:

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

De forma predeterminada, este objeto se coloca en (0, 0, 0) en las coordenadas mundiales de Unity, lo que funciona bien para este ejemplo.

Obtén la referencia de ARAnchorManager

Se requiere un ARAnchorManager para resolver las anclas geoespaciales durante el tiempo de ejecución, por lo que también necesitas una referencia al ARAnchorManager en la escena. Si comenzaste con la aplicación de ejemplo geoespacial incluida en las extensiones de ARCore, el Administrador de anclas se adjunta al objeto de juego "AR Session Origin". Si suponemos que tienes exactamente un administrador de anclas en tu escena, puedes obtener una referencia a él de la siguiente manera:

ARAnchorManager anchorManager =
    Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];

Ahora que tienes un origen y un administrador de anclas, puedes comenzar a crear los objetos ARGeospatialCreatorAnchor.

Crea anclas de terreno

Considera el siguiente array bidimensional de valores double, que representa la latitud y la longitud precisas en tres puntos del lado este del Ayuntamiento de San Francisco, California, EE.UU.:

double[,] _cityHallEastPoints = {
    { 37.77936, -122.418617 }, // in front of city hall
    { 37.77965, -122.418680 }, // right of city hall
    { 37.77917, -122.418577 }}; // left of city hall

Supongamos que quieres colocar un cubo de un metro en cada una de estas ubicaciones, a nivel del suelo, en nuestra aplicación de RA. Con el siguiente código, se crean objetos ARGeospatialCreatorAnchor y se asignan sus propiedades a los valores adecuados:

for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
  ARGeospatialCreatorAnchor anchor =
    new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
  anchor.Origin = origin;
  anchor.AnchorManager = anchorManager;
  anchor.Latitude = _cityHallEastPoints[i, 0];
  anchor.Longitude = _cityHallEastPoints[i, 1];
  anchor.AltitudeType = AnchorAltitudeType.Terrain;

  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
  cube.transform.parent = anchor.transform;
}

Esto crea anclas de terreno en cada punto. Geospatial Creator coloca automáticamente las anclas en las coordenadas mundiales de Unity adecuadas calculando su ubicación en relación con el objeto ARGeospatialCreatorOrigin. Para ajustar la altitud de un ancla de terreno, establece la propiedad Altitude en metros por encima o por debajo de la superficie del terreno.

Durante el tiempo de ejecución, los anclajes de terreno se resolverán a nivel del suelo para la app en ejecución, compensados por la propiedad Altitude. Sin embargo, en la vista de escena del editor, se renderizan a una altitud de WGS84 de 0 de forma predeterminada, no en relación con la geometría de la tarjeta 3D. A menudo, no es donde te gustaría verlos, por lo que puedes anular la altitud predeterminada del ancla en la vista de escena del Editor configurando la propiedad UseEditorAltitudeOverride en true y especificando la altitud en metros WGS84 con la propiedad EditorAltitudeOverride:

anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza

Estas dos propiedades no tienen efecto fuera del modo Editor y no se compilan en la app en ejecución.

Anclaje geoespacial en la plaza del Ayuntamiento

Crea un ancla en la azotea

Para nuestra siguiente ancla, supongamos que quieres colocar una en la azotea del ayuntamiento. El ancla se puede crear de la misma manera, excepto que la propiedad AltitudeType se establece en AnchorAltitudeType.Rooftop:

ARGeospatialCreatorAnchor cityHallRoofAnchor =
  new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;

GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;

Al igual que con los anclas de terreno, puedes ajustar la altitud de un ancla de techo en la vista de escena del editor con las propiedades UseEditorAltitudeOverride y EditorAltitudeOverride. En este ejemplo, la altitud WGS84 del techo es de aproximadamente 10.7 metros.

Anclaje geoespacial en el techo

Crea un ancla a una altitud específica

Nuestra última ancla se colocará en la parte superior de la cúpula del Ayuntamiento. Para esta ancla, es importante la altitud precisa, por lo que la establecerás de forma explícita con un ancla WGS84, en lugar de un ancla de terreno o techo:

ARGeospatialCreatorAnchor cityHallDomeAnchor =
  new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;

GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;

No es necesario usar la anulación de altitud solo para el editor, ya que la altitud ya se especifica según WGS84. Por supuesto, si la altura de la geometría de las tarjetas del mapa en el editor resultó ser incorrecta en comparación con el mundo real, aún puedes usar la anulación del editor para cambiar la posición del ancla en la vista de la escena.

Anclaje geoespacial en la cúpula