Utilizzare gli ancoraggi geospaziali per posizionare contenuti reali su iOS

Gli ancoraggi geospaziali sono un tipo di ancoraggio che ti consentono di posizionare contenuti 3D nel mondo reale.

Tipi di ancore geospaziali

Esistono tre tipi di ancore geospaziali, ognuna delle quali gestisce l'altitudine in modo diverso:

  1. Ancoraggi WGS84:
    gli ancoraggi WGS84 ti consentono di posizionare i contenuti 3D in qualsiasi latitudine, longitudine e altitudine.

  2. Ancoraggi al suolo:
    Gli ancoraggi al suolo ti consentono di posizionare i contenuti utilizzando solo la latitudine e la longitudine con un'altezza relativa al suolo in quella posizione. L'altitudine viene determinata rispetto al suolo o al pavimento come noto da VPS.

  3. Ancoraggie sul tetto:
    Gli ancoraggi sul tetto ti consentono di posizionare i contenuti utilizzando solo la latitudine e la longitudine con un'altezza relativa al tetto di un edificio in quella posizione. L'altitudine viene determinata in base alla sommità di un edificio, come indicato da Streetscape Geometry. Per impostazione predefinita, viene utilizzata l'altitudine del suolo se l'edificio non è presente.

WGS84 Rilievo Da tetto auto
Posizione orizzontale Latitudine, longitudine Latitudine, longitudine Latitudine, longitudine
Posizione verticale Rispetto all'altitudine WGS84 Rispetto al livello del terreno determinato da Google Maps In base al livello del tetto determinato da Google Maps
Deve essere risolta dal server? No

Prerequisiti

Assicurati di abilitare l'API Geospatial prima di procedere.

Posiziona ancoraggi geospaziali

Per ogni tipo di ancora esistono API dedicate per la loro creazione. Per ulteriori informazioni, consulta la sezione Tipi di ancore geospaziali.

Creare un ancoraggio da un hit test

Puoi anche creare un'ancora geospaziale da un risultato del test di corrispondenza. Usa la trasformazione dell'hit test e convertilo in un GARGeospatialTransform. Usala per posizionare uno dei 3 tipi di ancoraggio descritti.

Trasformazione geospaziale con AR

GARSession.geospatialTransformFromTransform:error: fornisce un modo aggiuntivo per determinare la latitudine e la longitudine convertendo una trasformazione AR in una trasformazione geospaziale.

Ottenere una trasformazione AR da una trasformazione geospaziale

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error: converte una posizione orizzontale, un'altitudine e una rotazione di quaternione specificati per la Terra rispetto a un sistema di coordinate est-alto-sud in una trasformazione AR rispetto alle coordinate mondiali GL.

Scegli il metodo più adatto al tuo caso d'uso

Ogni metodo di creazione di un'ancora ha dei compromessi da tenere presenti:

  • Quando utilizzi la geometria di Streetscape, utilizzare un hit-test per allegare contenuti a un edificio.
  • Preferisci gli ancoraggi al terreno o al tetto rispetto agli ancoraggi WGS84 perché utilizzano i valori di altitudine determinati da Google Maps.

Determinare la latitudine e la longitudine di un luogo

Esistono tre modi per calcolare la latitudine e la longitudine di una posizione:

  • Utilizza Geospatial Creator per visualizzare e ampliare il mondo con contenuti 3D senza dover recarti fisicamente in una località. In questo modo puoi posizionare visivamente contenuti immersivi 3D utilizzando Google Maps in Unity Editor. La latitudine, la longitudine, la rotazione e l'altitudine dei contenuti verranno calcolati automaticamente.
  • Utilizza Google Maps
  • Utilizza Google Earth. Tieni presente che l'ottenimento di queste coordinate utilizzando Google Earth, anziché Google Maps, ti darà un margine di errore fino a diversi metri.
  • Vai alla sede fisica

Utilizza Google Maps

Per ottenere la latitudine e la longitudine di un luogo utilizzando Google Maps:

  1. Accedi a Google Maps sul tuo computer.

  2. Vai a Livelli > Altro.

  3. Imposta Tipo di mappa su Satellite e deseleziona la casella di controllo Vista globo nell'angolo in basso a sinistra dello schermo.

    In questo modo verrà forzata una prospettiva 2D ed eliminati i possibili errori che potrebbero derivare da una vista 3D inclinata.

  4. Sulla mappa, fai clic con il tasto destro del mouse sulla posizione e seleziona la longitudine/latitudine per copiarla negli appunti.

Utilizzare Google Earth

Per calcolare la latitudine e la longitudine di un luogo a partire da Google Earth, fai clic su un luogo nell'interfaccia utente e leggi i dati del segnaposto.

Per ottenere la latitudine e la longitudine di una località utilizzando Google Earth:

  1. Apri Google Earth sul tuo computer.

  2. Vai al menu a tre linee e seleziona Stile mappa.

  3. Disattiva l'opzione Edifici in 3D.

  4. Una volta disattivata l'opzione Edifici in 3D, fai clic sull'icona a forma di puntina per aggiungere un segnaposto nella posizione selezionata.

  5. Specifica un progetto che contenga il segnaposto e fai clic su Salva.

  6. Nel campo Titolo del segnaposto, assegnagli un nome.

  7. Fai clic sulla freccia Indietro nel riquadro del progetto e seleziona il menu Altre azioni.

  8. Scegli Esporta come file KML dal menu.

Il file KLM segnala la latitudine, la longitudine e l'altitudine di un segnaposto nel tag <coordinates> separate da virgole, come segue:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

Non utilizzare i valori di latitudine e longitudine dei tag <LookAt>, che specificano la posizione della fotocamera, non la posizione.

Vai alla sede fisica

Puoi calcolare l'altitudine di una località recandoti sul posto ed effettuando un'osservazione locale.

Ottieni il quaternione di rotazione

GARGeospatialTransform.eastUpSouthQTarget estrae l'orientamento da una trasformazione geospaziale e restituisce un quaternione che rappresenta la matrice di rotazione che trasforma un vettore dal target al sistema di coordinate est-alto-sud (EUS). X+ punti verso est, Y+ punti verso l'alto e Z+ punti verso sud. I valori sono scritti nell'ordine {x, y, z, w}.

Ancore WGS84

Un'ancora WGS84 è un tipo di ancora che ti consente di posizionare contenuti 3D in qualsiasi latitudine, longitudine e altitudine. Si basa su una trasformazione e sull'orientamento per essere posizionato nel mondo reale. La posizione è costituita da latitudine, longitudine e altitudine, specificate nel sistema di coordinate WGS84. L'orientamento è costituito da una rotazione di quaternioni.

L'altitudine viene indicata in metri sopra l'ellissoide di riferimento WGS84, in modo che il livello del suolo non sia pari a zero. La tua app è responsabile di fornire queste coordinate per ogni ancoraggio creato.

Posiziona un'ancora WGS84 nel mondo reale

Determinare l'altitudine di un luogo

Esistono diversi modi per determinare l'altitudine di una posizione per posizionare gli ancoraggi:

  • Se la posizione dell'ancora è fisicamente vicina all'utente, puoi utilizzare un'altitudine simile a quella del dispositivo dell'utente.
  • Una volta indicate la latitudine e la longitudine, utilizza l'API Elevation per ottenere un'altitudine in base alla specifica EGM96. Devi convertire l'elevazione EGM96 dell'API di Google Maps in WGS84 per il confronto con l'altitudine di GARGeospatialTransform. Consulta GeoidEval, che ha sia una riga di comando che un'interfaccia HTML. L'API Maps riporta la latitudine e la longitudine in base alla specifica WGS84.
  • Puoi ottenere la latitudine, la longitudine e l'altitudine di una posizione da Google Earth. Questo ti darà un margine di errore fino a diversi metri. Utilizza la latitudine, la longitudine e l'altitudine dei tag <coordinates>, non dei tag <LookAt>, nel file KML.
  • Se nelle vicinanze è presente un'ancora esistente e se non ti trovi su una salita ripida, potresti essere in grado di utilizzare l'altitudine del GARGeospatialTransform della fotocamera senza utilizzare un'altra origine, come l'API Maps.

Crea l'ancoraggio

Una volta ottenuti i valori di latitudine, longitudine, altitudine e quaternione di rotazione, utilizza createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: per ancorare i contenuti alle coordinate geografiche da te specificate.

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];

Ancore del terreno

Un'ancora del terreno è un tipo di ancora che ti consente di posizionare oggetti AR utilizzando solo latitudine e longitudine, sfruttando le informazioni del VPS per trovare l'altitudine esatta sopra il suolo.

Invece di inserire l'altitudine desiderata, devi specificare l'altitudine sopra il livello del terreno. Quando questo valore è pari a zero, l'ancoraggio sarà alla stessa altezza del terreno.

Impostare la modalità di ricerca dell'aereo

Il rilevamento del piano è facoltativo e non è obbligatorio per utilizzare gli ancoraggi. Tieni presente che vengono utilizzati solo piani orizzontali. I piani orizzontali aiuteranno l'allineamento dinamico degli ancoraggi del terreno sul suolo.

Utilizza ARWorldTrackingConfiguration.PlaneDetection per selezionare la modalità di rilevamento degli aerei da parte dell'app.

Creare un'ancora del terreno utilizzando la nuova API asincrona

Per creare e posizionare un'ancora del terreno, chiama GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:.

L'ancoraggio non sarà pronto immediatamente e deve essere risolto. Una volta risolto, sarà disponibile in GARCreateAnchorOnTerrainFuture.

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Consulta lo stato del futuro

Al futuro sarà associato un elemento GARFutureState.

Stato Descrizione
GARFutureStatePending L'operazione è ancora in attesa.
GARFutureStateDone L'operazione è stata completata e il risultato è disponibile.
GARFutureStateCancelled L'operazione è stata annullata.

Controlla lo stato di ancoraggio Terreno del risultato Futuro

GARTerrainAnchorState appartiene all'operazione asincrona e fa parte del risultato futuro finale.

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Ancoraggi sul tetto

Hero per ancoraggi sul tetto

Gli ancoraggi sul tetto sono un tipo di ancoraggio e sono molto simili agli ancoraggi sul terreno sopra descritti. La differenza è che verrà indicata l'altitudine sopra il tetto piuttosto che l'altitudine sopra il livello del terreno.

Creare un'ancora sul tetto utilizzando la nuova API asincrona

L'ancora non sarà pronta immediatamente e dovrà essere risolta.

Per creare e posizionare un'ancora sul tetto, chiama GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:. Come per gli ancoraggi Terreno, accederai anche alla GARFutureState del Futuro. Poi puoi controllare il risultato futuro per accedere a GARRooftopAnchorState.

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Consulta lo stato del futuro

Al futuro sarà associato un elemento GARFutureState, vedi la tabella sopra.

Controlla lo stato dell'ancora sul tetto del risultato futuro

GARRooftopAnchorState appartiene all'operazione asincrona e fa parte del risultato futuro finale.

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Passaggi successivi