Crea e modifica in modo programmatico gli ancoraggi in Creator geospaziale in Unity

Questa guida descrive come utilizzare Geospatial Creator per scrivere script C# per eseguire rapidamente attività comuni come la creazione e lo spostamento di oggetti ARGeospatialCreatorAnchor nella modalità di modifica di Unity. Questa opzione può essere utile per creare più ancore da un elenco predefinito, ad esempio un foglio di lavoro o un file KML.

Geospatial Creator in Unity ti consente di visualizzare l'anteprima dei contenuti geospaziali nell'Editor di Unity. La nostra guida rapida introduce Geospatial Creator e illustra come creare la tua prima esperienza AR con funzionalità geografiche con una programmazione minima utilizzando l'interfaccia utente di Unity Editor. Per progetti più avanzati, ti consigliamo di creare e manipolare gli oggetti GameObject di Geospatial Creator tramite programmazione anziché utilizzare l'interfaccia utente di Unity Editor.

Questa guida presuppone che tu abbia familiarità con i concetti di base di Geospatial Creator introdotti nella guida rapida e che tu sia pronto per iniziare ad aggiungere ancore di Geospatial Creator a una scena. Devi avere Geospatial Creator abilitato e configurato con le tue chiavi API, nonché gli oggetti della sessione AR iniziale nella scena. Se parti da zero, segui la guida rapida, inclusa la sezione "Attiva Creatore di dati geografici", prima di continuare.

Per iniziare

Per questo esempio, supponiamo che tu abbia un insieme di posizioni note intorno al municipio di San Francisco, in California, Stati Uniti, in cui vuoi posizionare contenuti AR. Dovrai creare oggetti di ancoraggio in ciascuna di queste posizioni e poi collegare la geometria di base a questi ancoraggi.

Prima di poter creare ancore, devi specificare un ARGeospatialCreatorOrigin, che è un punto di riferimento per la conversione di latitudini, longitudini e altitudini verso e da coordinate mondiali di Unity. L'origine conterrà anche un componente secondario CesiumGeoreference e un oggetto secondario Cesium3DTileset, che consente a Cesium di eseguire il rendering dell'area circostante nella visualizzazione Scena dell'editor Unity. Per farlo, devi disporre di una chiave API Google Maps Tiles come descritto nella guida rapida.

Creare un'origine

L'API per Geospatial Creator include un metodo di fabbrica per creare un ARGeospatialCreatorOrigin nella scena e aggiungere i componenti Cesium richiesti. Il codice seguente crea l'origine a una latitudine, longitudine e altitudine vicine e utilizza la chiave API Map Tiles specificata:

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

Per impostazione predefinita, questo oggetto è posizionato in (0, 0, 0) nelle coordinate mondiali di Unity, che funziona bene per questo esempio.

Recupera il riferimento ARAnchorManager

Per risolvere gli ancoraggi geospaziali in fase di esecuzione è necessario un ARAnchorManager, quindi devi anche avere un riferimento a ARAnchorManager nella scena. Se hai iniziato con l'applicazione di esempio geospaziale inclusa in ARCore Extensions, Anchor Manager è associato all'oggetto GameObject "AR Session Origin". Supponendo di avere esattamente un gestore di ancore nella scena, puoi ottenere un riferimento come questo:

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

Ora che hai un'origine e un gestore di ancore, puoi iniziare a creare gli oggetti ARGeospatialCreatorAnchor.

Crea ancore del terreno

Considera il seguente array bidimensionale di valori double, che rappresenta la latitudine e la longitudine precise in tre punti sul lato rivolto a est del municipio di San Francisco, in California, Stati Uniti:

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

Supponiamo che tu voglia posizionare un cubo di un metro in ciascuna di queste posizioni, a livello del suolo, nella nostra applicazione AR. Il seguente codice crea oggetti ARGeospatialCreatorAnchor e assegna le relative proprietà ai valori appropriati:

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

In questo modo vengono creati ancoraggi del terreno in ogni punto. Geospatial Creator colloca automaticamente gli ancoraggi alle coordinate mondiali di Unity appropriate, calcolandone la posizione rispetto all'oggetto ARGeospatialCreatorOrigin. Per regolare l'elevazione di un ancoraggio del terreno, imposta la proprietà Altitude in metri sopra o sotto la superficie del terreno.

In fase di esecuzione, gli ancoraggi del terreno verranno risolti a livello del suolo per l'app in esecuzione, compensati dalla proprietà Altitude. Nella visualizzazione della scena di Editor, però, vengono visualizzati con un'altitudine WGS84 pari a 0 per impostazione predefinita, non in base alla geometria della scheda 3D. Spesso non è dove vorresti vederli, quindi puoi sostituire l'altitudine predefinita dell'ancora nella visualizzazione della scena di Editor impostando la proprietà UseEditorAltitudeOverride su true e specificando l'altitudine in metri WGS84 utilizzando la proprietà EditorAltitudeOverride:

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

Queste due proprietà non hanno alcun effetto al di fuori della modalità Editor e non vengono compilate nell'app in esecuzione.

Ancoraggio geospaziale in City Hall Plaza

Crea un'ancora sul tetto

Per il nostro prossimo riferimento, supponiamo che tu voglia posizionarne uno sul tetto del municipio. L'ancora può essere creata nello stesso modo, tranne per il fatto che la proprietà AltitudeType è impostata su 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;

Come per gli ancoraggi del terreno, puoi perfezionare l'altitudine di un ancoraggio sul tetto nella vista della scena dell'editor utilizzando le proprietà UseEditorAltitudeOverride e EditorAltitudeOverride. Per questo esempio, l'altezza WGS84 del roof è di circa 10,7 metri.

Ancoraggio geospaziale sul tetto

Creare un'ancora a un'altitudine specifica

La nostra ancora finale verrà posizionata sulla sommità della cupola del municipio. Per questo ancoraggio, l'altitudine esatta è importante, quindi lo imposterai esplicitamente utilizzando un ancoraggio WGS84 anziché un ancoraggio sul tetto o sul terreno:

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;

Non è necessario utilizzare l'override dell'altitudine solo per l'editor, poiché l'altitudine è già specificata in base a WGS84. Ovviamente, se l'altezza della geometria dei riquadri della mappa nell'editor risulta non corretta rispetto al mondo reale, puoi comunque utilizzare l'override dell'editor per riposizionare l'ancora nella visualizzazione della scena.

Ancoraggio geospaziale sulla cupola