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# para 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 Unity Editor. Nuestra guía de inicio rápido se presenta el Creador de Geospatial y te indica cómo crear tu primer Experiencia de RA geoespacial con programación mínima, con Unity IU de Editor. 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 asume que conoces los conceptos básicos del Creador de Geospatial que se presentó en la guía de inicio rápido, y está todo listo para que comiences a agregar Geospatial El creador se ancla en 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

Para este ejemplo, supongamos que tiene un conjunto de ubicaciones conocidas alrededor del Ayuntamiento en San Francisco, California, EE.UU., donde quieres 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, que permite que Cesium renderice el entorno en la vista Scene 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 exactamente un administrador de anclas en tu escena, puedes obtener una referencia a él, como esto:

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

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

Crear 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 ARGeospatialCreatorAnchor y asigna sus propiedades a la 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. Creador de Geospatial automáticamente coloca las anclas en las coordenadas mundiales adecuadas de Unity, calculando su ubicación relativa al objeto ARGeospatialCreatorOrigin. Para ajustar el de un anclaje del terreno, define la propiedad Altitude en metros por encima o bajo 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, renderizar a una altitud de 0 en WGS84 de forma predeterminada, no relacionada 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 compilarse en la aplicación en ejecución.

Ancla geoespacial en City Hall Plaza

Cómo crear 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 exactamente de la misma manera, excepto la AltitudeType se configura como 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. Para este ejemplo, la altitud WGS84 del que el techo es de unos 10.7 metros.

Ancla geoespacial en el techo

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

El anuncio final 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 Map Tiles del editor resultó ser incorrecto en comparación con el mundo real, puedes usar la anulación del editor para cambiar la posición del ancla en la escena vista.

Ancla geoespacial en el domo