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

En esta guía, se describe cómo usar el Creador de Geospatial para escribir secuencias de comandos de C# y realizar con rapidez tareas comunes, como crear y mover objetos ARGeospatialCreatorAnchor en el modo de edición de Unity. Esto puede resultar útil para crear varias anclas 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 Unity Editor. 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 usando la IU del editor de Unity. Para proyectos más avanzados, te recomendamos que crees y manipules los GameObjects del Creador de Geospatial de manera programática en lugar de usar la IU del editor de Unity.

En esta guía, se supone que conoces los conceptos básicos del Creador de Geospatial que se introdujeron en la guía de inicio rápido y que estás listo para comenzar a agregar anclas del Creador de Geospatial a una escena. Deberás tener el Creador de Geospatial habilitado y configurado con tus claves de API, así como los objetos de sesión de RA inicial en la escena. Si comienzas desde cero, sigue la guía de inicio rápido e incluye la sección “Habilita el creador de datos geoespaciales” antes de continuar.

Primeros pasos

Para este ejemplo, supongamos que tienes un conjunto de ubicaciones conocidas alrededor del ayuntamiento de San Francisco, California, EE.UU., en las que quieres colocar contenido de RA. Deberás crear objetos de anclaje en cada una de estas ubicaciones y, luego, adjuntar la geometría básica a esas anclas.

Antes de crear anclas, debes especificar un ARGeospatialCreatorOrigin, que es un punto de referencia para convertir latitudes, longitudes y latitudes desde y hacia 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 Scene del editor de Unity. Para ello, necesitas una clave de API de Google Map 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 necesarios de Cesium. Con el siguiente código, se crea el origen a una latitud, longitud y altitud cercanas, y con 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 en este ejemplo.

Obtén la referencia de ARAnchorManager

Se requiere un objeto ARAnchorManager para resolver las anclas geoespaciales en 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 muestra de Geospatial incluida en las extensiones de ARCore, el administrador de Anchor se adjunta al GameObject "AR Session Origin". Si suponemos que tienes exactamente un administrador de anclas en la 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.

Cómo crear anclas de terreno

Considera el siguiente array bidimensional de valores de double, que representa la latitud y longitud precisas en tres puntos en el lado este del ayuntamiento en 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;
}

De esta forma, se crean anclajes de terreno en cada punto. El Creador de Geospatial coloca las anclas automáticamente 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, desplazados por la propiedad Altitude. Sin embargo, en la vista de escena del editor, se renderizan a una altitud WGS84 de 0 de forma predeterminada, no con respecto a la geometría de mosaicos 3D. A menudo, no es el lugar donde deseas verlos, por lo que puedes anular la altitud predeterminada del ancla en la vista de escena del editor. Para ello, establece la propiedad UseEditorAltitudeOverride en true y especifica la altitud en WGS84 metros 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 de editor y no se compilan en la app en ejecución.

Ancla geoespacial en la plaza del ayuntamiento

Crea un ancla de techo

Para nuestra próxima ancla, imagina que deseas colocar un ancla en el techo del City Hall. 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 las anclas de terreno, puedes ajustar la altitud de un ancla de techo en la vista de escena del editor mediante las propiedades UseEditorAltitudeOverride y EditorAltitudeOverride. Para este ejemplo, la altitud WGS84 del techo es de aproximadamente 10.7 metros.

Anclaje geoespacial en el techo

Cómo crear un ancla a una altitud específica

Nuestro ancla final se colocará en la parte superior del domo del ayuntamiento. Para este ancla, la altitud precisa es importante, por lo que deberás establecerla explícitamente mediante el uso de un ancla WGS84, en lugar de un anclaje de terreno o de 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 exclusiva del editor, dado que la altitud ya se especificó según el estándar WGS84. Por supuesto, si la altura de la geometría de los mosaicos de mapa del editor resultara ser incorrecta en comparación con el mundo real, aún podrías usar la anulación del editor para cambiar la posición del ancla en la vista de escena.

Ancla geoespacial en la cúpula