Créer et modifier des ancres dans Geospatial Creator dans Unity par programmation

Ce guide explique comment utiliser Geospatial Creator pour écrire des scripts C# afin d'accomplir rapidement des tâches courantes telles que la création et le déplacement d'objets ARGeospatialCreatorAnchor en mode Édition dans Unity. Cela peut être utile pour créer plusieurs ancrages à partir d'une liste prédéfinie telle qu'une feuille de calcul ou un fichier KML.

Geospatial Creator dans Unity vous permet de prévisualiser le contenu géospatial dans l'éditeur Unity. Notre guide de démarrage rapide présente Geospatial Creator et vous explique comment créer votre première expérience de RA compatible avec géospatiale avec un minimum de programmation, à l'aide de l'interface utilisateur de l'éditeur Unity. Pour les projets plus avancés, vous pouvez créer et manipuler des GameObjects Geospatial Creator par programmation au lieu d'utiliser l'interface utilisateur de l'éditeur Unity.

Dans ce guide, nous partons du principe que vous connaissez les concepts de base de Geospatial Creator présentés dans le guide de démarrage rapide, et que vous êtes prêt à ajouter des ancres Geospatial Creator à une scène. Geospatial Creator doit être activé et configuré avec vos clés API, ainsi que les objets de session de RA initiaux dans votre scène. Si vous partez de zéro, suivez le guide de démarrage rapide en y incluant la section Activer Geospatial Creator avant de continuer.

Premiers pas

Pour cet exemple, supposons que vous ayez un ensemble de lieux connus autour de l'hôtel de ville de San Francisco, en Californie (États-Unis), où vous souhaitez placer du contenu en RA. Vous devez créer des objets d'ancrage à chacun de ces emplacements, puis leur associer une géométrie de base.

Avant de pouvoir créer des ancres, vous devez spécifier un ARGeospatialCreatorOrigin, qui est un point de référence pour convertir les latitudes, longitudes et altitudes depuis et vers les coordonnées mondiales Unity. L'origine contiendra également un sous-composant CesiumGeoreference et un objet enfant Cesium3DTileset, ce qui permet à Cesium d'afficher la zone environnante dans la vue "Scene" (Scène) de l'éditeur Unity. Pour ce faire, vous avez besoin d'une clé API Google Maps Tiles, comme décrit dans le guide de démarrage rapide.

Créer une origine

L'API pour Geospatial Creator inclut une méthode de fabrique permettant de créer un ARGeospatialCreatorOrigin dans la scène et d'ajouter les composants Cesium requis. Le code suivant crée le point de départ à une latitude, une longitude et une altitude à proximité, et utilise la clé API Map Tiles fournie:

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

Par défaut, cet objet est placé aux coordonnées (0, 0, 0) en coordonnées mondiales Unity, ce qui fonctionne bien pour cet exemple.

Obtenir la documentation de référence sur ARAnchorManager

Un ARAnchorManager est nécessaire pour résoudre les ancres géospatiales au moment de l'exécution. Vous avez donc également besoin d'une référence à ARAnchorManager dans la scène. Si vous avez commencé avec l'exemple d'application Geospatial fourni avec des extensions ARCore, le gestionnaire d'ancrage est associé au GameObject "AR Session Origin". Si vous n'avez qu'un seul gestionnaire d'ancrage dans votre scène, vous pouvez obtenir une référence à celui-ci comme suit:

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

Maintenant que vous disposez d'une origine et d'un gestionnaire d'ancres, vous pouvez commencer à créer les objets ARGeospatialCreatorAnchor.

Créer des ancrages de relief

Prenons l'exemple du tableau bidimensionnel suivant de valeurs double, représentant la latitude et la longitude précises en trois points du côté est de l'hôtel de ville de San Francisco, en Californie, aux États-Unis:

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

Supposons que vous souhaitiez placer un cube d'un mètre à chacun de ces emplacements, au niveau du sol, dans notre application de RA. Le code suivant crée des objets ARGeospatialCreatorAnchor et attribue leurs propriétés aux valeurs appropriées:

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;
}

Cela crée des ancrages de relief à chaque point. Geospatial Creator place automatiquement les ancres aux coordonnées mondiales appropriées en calculant leur position par rapport à l'objet ARGeospatialCreatorOrigin. Pour ajuster l'altitude d'une ancre de relief, définissez la propriété Altitude en mètres au-dessus ou en dessous de la surface du relief.

Au moment de l'exécution, les ancrages de terrain se résolvent au niveau du sol pour l'application en cours d'exécution, décalés par la propriété Altitude. Toutefois, dans la vue de la scène de l'éditeur, le rendu se fait à une altitude WGS84 de 0 par défaut, et non par rapport à la géométrie de la tuile 3D. Ce n'est souvent pas l'endroit où vous souhaitez les voir. Vous pouvez donc remplacer l'altitude par défaut de l'ancre dans la vue de la scène de l'éditeur en définissant la propriété UseEditorAltitudeOverride sur true et en spécifiant l'altitude en WGS84 mètres à l'aide de la propriété EditorAltitudeOverride:

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

Ces deux propriétés n'ont aucun effet en dehors du mode Éditeur et ne sont pas compilées dans l'application en cours d'exécution.

Ancre géospatiale sur la place de l&#39;hôtel de ville

Créer un ancrage de toit

Supposons que vous souhaitiez placer une ancre sur le toit du City Hall. L'ancre peut être créée exactement de la même manière, si ce n'est que la propriété AltitudeType est définie sur 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;

Comme pour les ancres de relief, vous pouvez ajuster l'altitude d'une ancre sur le toit dans la vue de la scène de l'éditeur à l'aide des propriétés UseEditorAltitudeOverride et EditorAltitudeOverride. Dans cet exemple, l'altitude WGS84 du toit est d'environ 10,7 mètres.

Ancre géospatiale sur le toit

Créer une ancre à une altitude spécifique

Notre dernier point d'ancrage sera placé tout en haut du dôme de l'hôtel de ville. Pour cette ancre, l'altitude exacte est importante. Vous devez donc la définir explicitement à l'aide d'une ancre WGS84, et non d'une ancre de relief ou de toit:

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;

Il n'est pas nécessaire d'utiliser le remplacement d'altitude réservé à l'éditeur, car l'altitude est déjà spécifiée selon WGS84. Bien entendu, si la hauteur de la géométrie des tuiles de carte dans l'éditeur s'avère incorrecte par rapport au monde réel, vous pouvez toujours utiliser le forçage de l'éditeur pour repositionner l'ancre dans la vue de la scène.

Ancre géospatiale sur le dôme