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.
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.
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.