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 Creación de 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, se recomienda crear y manipular GameObjects del creador geoespacial de manera programática en lugar de usar Unity IU de Editor.

En esta guía, se da por sentado que conoces los conceptos básicos del Creador de Geospatial que se presentaron en la Guía de inicio rápido y que tienes todo listo para comenzar a agregar anclas del Creador de Geospatial a una escena. Deberás tener habilitado el Creador de Geospatial y configurados con tus claves de API y los objetos de sesión de RA iniciales en tu escena. Si comienzas desde cero, sigue la Guía de inicio rápido y incluida la opción "Habilitar Geospatial Creador" 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. Lo que harás crear objetos de ancla en cada una de estas ubicaciones y, luego, conectar la geometría de las anclas.

Antes de crear anclas, debes especificar un ARGeospatialCreatorOrigin, que es un punto de referencia para convertir latitudes, longitudes y latitudes 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 esto, necesitas un mapa de Google de Tiles como se describe en el la Guía de inicio rápido

Crea un origen

La API de Creador de Geospatial incluye un método de fábrica para crear una ARGeospatialCreatorOrigin en la escena y agrega los componentes Cesium requeridos. El siguiente código crea el origen en una latitud, longitud y y usar la clave de API de Map Tiles determinada:

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 coordenadas mundiales de Unity, que funciona bien en este ejemplo.

Obtén la referencia de ARAnchorManager

Un objeto ARAnchorManager para resolver anclas geoespaciales en el tiempo de ejecución, por lo que También necesitas una referencia a ARAnchorManager en la escena. Si empezaste con la aplicación de muestra de Geospatial empaquetada con las extensiones de ARCore, la API de El administrador está conectado al "Origen de la sesión de RA" GameObject: Si suponemos que tienes examente 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 de 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, en el suelo en nuestra aplicación de RA. El siguiente código crea objetos ARGeospatialCreatorAnchor y les asigna 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. El Creador de Geospatial 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.

En el tiempo de ejecución, las anclas de terreno se resolverán a nivel del suelo para la aplicación en ejecución, compensada por la propiedad Altitude. Sin embargo, en la vista de escena del Editor, se renderizan a una altitud de 0 en WGS84 de forma predeterminada, no en relación con el mosaico 3D. geometría. Suele no ser el lugar donde te gustaría verlos, así que puedes anular el altitud predeterminada del ancla en la vista de escena del Editor estableciendo la UseEditorAltitudeOverride en true y especificando 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 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, supongamos que quieres colocar un ancla en la azotea de una ciudad. 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 techo. ancla en la vista de escena del Editor con los elementos UseEditorAltitudeOverride EditorAltitudeOverride propiedades. En este ejemplo, la altitud WGS84 del techo es de aproximadamente 10.7 metros.

Ancla geoespacial en el techo

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

Nuestra última ancla se colocará en la parte superior de la cúpula del Ayuntamiento. Para ancla, la altitud precisa es importante, así que la establecerás explícitamente con un ancla WGS84, en lugar de un ancla de terreno o en el 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 es especificado según WGS84. Por supuesto, si la altura de la geometría de las tarjetas de mapa en el editor resulta 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 escena.

Ancla geoespacial en la cúpula