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 svolgere rapidamente le attività comuni come creare e spostare oggetti ARGeospatialCreatorAnchor nella modalità di modifica di Unity. Può essere utile per creare più ancoraggi da un elenco predefinito, ad esempio un foglio di lavoro o un file KML.

La funzionalità Creatore geospaziali di Unity ti consente di visualizzare l'anteprima dei contenuti geospaziali nell'Editor di Unity. La nostra guida rapida presenta il programma Geospaziale Creator e spiega come creare la tua prima esperienza AR geospaziale con una programmazione minima, utilizzando l'interfaccia utente dell'editor di Unity. Per progetti più avanzati, ti consigliamo di creare e gestire GameObjects Geospaziali Creator in modo programmatico invece di utilizzare l'interfaccia utente di Unity Editor.

Questa guida presuppone che tu abbia familiarità con i concetti di base per i creator di contenuti geospaziali presentati nella guida rapida e che tu sia pronto per iniziare ad aggiungere ancoraggi dei creator geospaziali a una scena. Devi aver abilitato e configurato Geospatial Creator con le tue chiavi API e con gli oggetti della sessione AR iniziali nella tua scena. Se parti da zero, segui la guida rapida che include la sezione "Abilita creatore geospaziale" prima di continuare.

Per iniziare

Per questo esempio, supponi di avere un insieme di località note vicino al Municipio di San Francisco, California, USA, in cui vuoi inserire contenuti AR. Dovrai creare oggetti di ancoraggio in ognuna di queste posizioni e poi collegare la geometria di base a questi ancoraggi.

Prima di poter creare gli ancoraggi, devi specificare un ARGeospatialCreatorOrigin, che è un punto di riferimento per la conversione di latitudini, longitudini e altitudini da e verso le coordinate mondiali di Unity. L'origine conterrà anche un sottocomponente CesiumGeoreference e un oggetto figlio Cesium3DTileset, che permette a Cesium di visualizzare l'area circostante nella visualizzazione Scena dell'editor Unity. A questo scopo, è necessaria una chiave API Google Map Tiles, come descritto nella guida rapida

Crea un'origine

L'API per Geospatial Creator include un metodo di produzione per creare un ARGeospatialCreatorOrigin nella scena e aggiungere i componenti Cesium richiesti. Il seguente codice crea l'origine a latitudine, longitudine e altitudine vicine e utilizzando 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 a (0, 0, 0) nelle coordinate del mondo Unity, opzione che funziona bene per questo esempio.

Ottieni il riferimento ARAnchorManager

Per risolvere gli ancoraggi geospaziali in fase di runtime, è necessario un ARAnchorManager, quindi è necessario anche un riferimento a ARAnchorManager nella scena. Se hai iniziato con l'applicazione Geospatial Sample in bundle con le estensioni ARCore, Anchor Manager è associato al GameObject "AR Session Origin". Supponendo che ci sia esattamente un gestore di ancoraggio nella scena, puoi recuperarlo come segue:

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

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

Creare ancoraggi per rilievi

Considera il seguente array bidimensionale di valori double, che rappresentano esattamente la latitudine e la longitudine in tre punti sul lato rivolto a est del municipio di San Francisco, 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 ognuna di queste posizioni, a livello del suolo, nella nostra applicazione AR. Il seguente codice crea gli 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 al terreno in ogni punto. Geospaziale Creator posiziona automaticamente gli ancoraggi alle appropriate coordinate mondiali di Unity, calcolandone la posizione rispetto all'oggetto ARGeospatialCreatorOrigin. Per regolare l'altitudine di un ancoraggio del terreno, imposta la proprietà Altitude in metri sopra o sotto la superficie del terreno.

In fase di runtime, gli ancoraggi di terreno verranno risolti a livello del suolo per l'app in esecuzione, compensati dalla proprietà Altitude. Tuttavia, nella visualizzazione delle scene dell'editor, per impostazione predefinita vengono visualizzate a un'altitudine WGS84 pari a 0, non rispetto alla geometria dei riquadri 3D. Questo spesso non è il punto in cui vorresti vederle, quindi puoi sostituire l'altitudine predefinita dell'ancoraggio nella visualizzazione delle scene dell'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 effetto al di fuori della modalità Editor e non vengono compilate nell'app in esecuzione.

Ancora geospaziale nella piazza del municipio

Creare un ancoraggio per il tetto

Per la prossima ancorata, supponi di voler posizionare un'ancora sul tetto del Municipio. L'ancoraggio può essere creato esattamente allo stesso modo, ad eccezione del 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 per il terreno, puoi regolare con precisione l'altitudine di un ancoraggio sul tetto nella vista della scena dell'editor utilizzando le proprietà UseEditorAltitudeOverride e EditorAltitudeOverride. In questo esempio, l'altitudine WGS84 del tetto è di circa 10,7 metri.

Ancoraggio geospaziale sul tetto

Creare un ancoraggio a un'altitudine specifica

L'ultima ancora verrà posizionata in cima alla cupola del municipio. Per questo ancoraggio, l'altitudine esatta è importante, quindi la dovrai impostare in modo esplicito utilizzando un ancoraggio WGS84, anziché un terreno o un ancoraggio sul tetto:

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 la sostituzione di altitudine solo con l'editor, poiché l'altitudine è già specificata in base a WGS84. Ovviamente, se l'altezza della geometria dei riquadri delle mappe nell'editor si rivelava errata rispetto al mondo reale, puoi comunque utilizzare l'override dell'editor per riposizionare l'ancoraggio nella visualizzazione della scena.

Ancora geospaziale sulla cupola