Mit raumbezogenen Ankern reale Inhalte auf iOS-Geräten positionieren

Raumbezogene Anker sind eine Art Anker, mit dem Sie 3D-Inhalte in der realen Welt platzieren können.

Arten von raumbezogenen Ankern

Es gibt drei Arten von geografischen Markierungen, die die Höhe unterschiedlich handhaben:

  1. WGS84-Anker:
    Mit WGS84-Ankern können Sie 3D-Content an einem beliebigen Breitengrad, Längengrad und Höhe.

  2. Geländeanker:
    Mit Geländeankern können Sie Inhalte nur mithilfe von Breiten- und Längengrad mit einer Höhe relativ zum Gelände an dieser Position. Die Höhe wird relativ zum Boden bestimmt, von VPS.

  3. Dachanker:
    Mit Dachankern können Sie Inhalte nur mithilfe von Breiten- und Längengrad sowie einer Höhe relativ zum Dach eines Gebäudes an dieser Position platzieren. Die Höhe wird relativ zum Dach eines Gebäudes bestimmt, wie es aus der Straßenraumgeometrie hervorgeht. Wenn die Markierung nicht auf einem Gebäude platziert wird, wird standardmäßig die Geländehöhe verwendet.

WGS84 Gelände Dach
Horizontale Position Breitengrad, Längengrad Breitengrad, Längengrad Breitengrad, Längengrad
Vertikale Position Relativ zur WGS84-Höhe Relativ zur von Google Maps ermittelten Geländeebene Relativ zur von Google Maps bestimmten Dachhöhe
Muss serverseitig aufgelöst werden? Nein Ja Ja

Vorbereitung

Aktivieren Sie die Geospatial API, bevor Sie fortfahren.

Georeferenzierte Markierungen platzieren

Für jeden Ankertyp gibt es spezielle APIs, mit denen er erstellt werden kann. Weitere Informationen finden Sie unter Arten von geografischen Markierungen.

Anker aus einem Treffertest erstellen

Sie können auch einen geografischen Anker aus einem Ergebnis eines Treffertests erstellen. Verwenden Sie die Transformation aus dem Treffertest und konvertieren Sie sie in einen GARGeospatialTransform. Damit können Sie einen der drei beschriebenen Ankertypen platzieren.

Geospatiale Transformation aus einer AR-Transformation abrufen

GARSession.geospatialTransformFromTransform:error: bietet eine weitere Möglichkeit, Breiten- und Längengrad zu bestimmen, indem eine AR-Transformation in eine Geospatial-Transformation umgewandelt wird.

AR-Transformation aus einer geospatialen Transformation abrufen

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error: wandelt eine von der Erde angegebene horizontale Position, Höhe und Quaternionrotation in Bezug auf einen Ost-auf-Süd-Koordinaten-Frame in eine AR-Transformation in Bezug auf die GL-Weltkoordinaten um.

Methode für Ihren Anwendungsfall auswählen

Jede Methode zum Erstellen eines Ankers hat bestimmte Vor- und Nachteile:

  • Wenn Sie Streetscape-Geometrie verwenden: einen Treffertest verwenden, um einem Gebäude Inhalte hinzuzufügen.
  • Verwenden Sie vorzugsweise Gelände- oder Dachanker anstelle von WGS84-Ankern, da für diese Altitude-Werte verwendet werden, die von Google Maps ermittelt wurden.

Breiten- und Längengrad eines Standorts ermitteln

Es gibt drei Möglichkeiten, den Breiten- und Längengrad eines Standorts zu berechnen:

  • Mit dem Geospatial Creator kannst du die Welt mit 3D-Inhalten erweitern, ohne dich persönlich aufsuchen zu müssen. So können Sie immersive 3D-Inhalte mithilfe von Google Maps im Unity-Editor platzieren. Breiten- und Längengrad, Drehung und Höhe des Inhalts werden automatisch für Sie berechnet.
  • Google Maps verwenden
  • Google Earth verwenden Beachten Sie, dass die Koordinaten, die Sie mit Google Earth erhalten, im Gegensatz zu Google Maps eine Fehlertoleranz von bis zu mehreren Metern haben.
  • Zum physischen Standort gehen

Google Maps verwenden

So ermitteln Sie mit Google Maps den Breiten- und Längengrad eines Standorts:

  1. Rufen Sie auf Ihrem Computer Google Maps auf.

  2. Gehen Sie zu Ebenen > Mehr.

  3. Ändern Sie den Kartentyp in Satellit und entfernen Sie das Häkchen im Kästchen Globusansicht links unten auf dem Bildschirm.

    Dadurch wird eine 2D-Perspektive erzwungen und mögliche Fehler vermieden, die aus einer schrägen 3D-Ansicht entstehen könnten.

  4. Klicken Sie auf der Karte mit der rechten Maustaste auf den Standort und wählen Sie die Längen-/Breitengrade aus, um sie in die Zwischenablage zu kopieren.

Google Earth verwenden

Sie können den Längen- und Breitengrad eines Ortes in Google Earth berechnen, indem Sie in der Benutzeroberfläche auf einen Ort klicken und die Daten der Ortsmarkierungsdetails auslesen.

So rufen Sie mit Google Earth den Breiten- und Längengrad eines Orts ab:

  1. Rufen Sie auf Ihrem Computer Google Earth auf.

  2. Gehen Sie zum Dreistrich-Menü und wählen Sie Kartenstil aus.

  3. Deaktivieren Sie den Schalter 3D-Gebäude.

  4. Deaktivieren Sie den Schalter 3D-Gebäude und klicken Sie auf das Stecknadelsymbol , um eine Ortsmarkierung für den ausgewählten Ort hinzuzufügen.

  5. Geben Sie ein Projekt für die Ortsmarkierung an und klicken Sie auf Speichern.

  6. Geben Sie im Feld Titel einen Namen für die Ortsmarkierung ein.

  7. Klicken Sie im Projektbereich auf den Zurückpfeil  und wählen Sie das Dreipunkt-Menü  Weitere Aktionen aus.

  8. Wählen Sie im Menü Als KML-Datei exportieren aus.

In der KLM-Datei werden die Breite, Länge und Höhe eines Ortsmarks im <coordinates>-Tag durch Kommas getrennt angegeben, wie hier:

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

Verwenden Sie nicht den Breiten- und Längengrad aus den <LookAt>-Tags, da diese die Kameraposition und nicht den Standort angeben.

Zum physischen Standort gehen

Sie können die Höhe eines Standorts berechnen, indem Sie eine physische Beobachtung vornehmen und eine Beobachtung vornehmen.

Rotationsquaternion abrufen

GARGeospatialTransform.eastUpSouthQTarget extrahiert die Ausrichtung aus einer Geospatial-Transformation und gibt eine Quaternion aus, die die Rotationsmatrix darstellt, die einen Vektor vom Ziel in das Ost-auf-Süd-Koordinatensystem (EUS) transformiert. X+ zeigt nach Osten, Y+ nach oben und Z+ nach Süden. Werte werden in der Reihenfolge {x, y, z, w} geschrieben.

WGS84-Anker

Ein WGS84-Ankertyp ist eine Art Anker, mit dem Sie 3D-Inhalte an einem beliebigen Breiten-, Längengrad und in der Höhe platzieren können. Es stützt sich auf eine Transformation und eine Ausrichtung, die in der realen Welt platziert werden. Die Position besteht aus einem Breiten- und Längengrad sowie einer Höhe, die im WGS84-Koordinatensystem angegeben sind. Die Ausrichtung besteht aus einer Quaternionsrotation.

Die Höhe wird in Metern über dem Referenz-WGS84-Ellipsoid angegeben, sodass der Nullpunkt nicht auf Höhe des Bodens liegt. Ihre App ist für die Bereitstellung dieser Koordinaten für jeden erstellten Anker verantwortlich.

Platziere einen WGS84-Anker in der realen Welt

Höhe eines Standorts bestimmen

Es gibt mehrere Möglichkeiten, die Höhe eines Standorts zum Platzieren von Ankern zu bestimmen:

  • Wenn sich der Ankerort in der Nähe des Nutzers befindet, können Sie eine Höhe verwenden, die der Höhe des Geräts des Nutzers entspricht.
  • Sobald Sie die Breiten- und Längengrade haben, verwenden Sie die Elevation API, um eine Höhe gemäß der EGM96-Spezifikation abzurufen. Sie müssen die EGM96-Höhe der Maps API in WGS84 umrechnen, um sie mit der GARGeospatialTransform zu vergleichen. Weitere Informationen finden Sie unter GeoidEval, das sowohl eine Befehlszeile als auch eine HTML-Benutzeroberfläche hat. Die Maps API gibt standardmäßig Breiten- und Längengrade gemäß der WGS84-Spezifikation zurück.
  • Breiten- und Längengrad sowie Höhe eines Standorts können Sie in Google Earth abrufen. Das führt zu einer Fehlertoleranz von bis zu mehreren Metern. Verwenden Sie in der KML-Datei die Breiten- und Längengrade sowie die Höhe aus den <coordinates>-Tags, nicht aus den <LookAt>-Tags.
  • Wenn sich ein vorhandener Anker in der Nähe befindet und Sie sich nicht an einem steilen Hang befinden, können Sie die Höhe von der GARGeospatialTransform der Kamera verwenden, ohne eine andere Quelle wie die Maps API zu verwenden.

Anker erstellen

Sobald Sie Breiten-, Längengrad, Höhe und Quaternion der Drehung ermittelt haben, verwenden Sie createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error:. zum Verankern von Inhalten an den von Ihnen angegebenen geografischen Koordinaten.

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

Geländeanker

Ein Geländeanker ist eine Art Anker, mit dem Sie AR-Objekte nur mithilfe von Längen- und Breitengraden platzieren können. Dabei werden Informationen aus dem VPS verwendet, um die genaue Höhe über dem Boden zu ermitteln.

Anstatt die gewünschte Höhe einzugeben, legen Sie die Höhe über dem Gelände fest. Wenn dieser Wert null ist, befindet sich der Anker auf einer Höhe des Geländes.

Modus für die Flugzeugsuche festlegen

Die Suche nach der Ebene ist optional und nicht erforderlich, um Anker zu verwenden. Es werden nur horizontale Ebenen verwendet. Horizontale Ebenen erleichtern die dynamische Ausrichtung von Geländeankern am Boden.

Mit ARWorldTrackingConfiguration.PlaneDetection kannst du festlegen, wie deine App Flugzeuge erkennt.

Geländeanker mit der neuen Async API erstellen

Rufen Sie zum Erstellen und Platzieren eines Geländeankers GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error: auf.

Der Anker ist nicht sofort verfügbar und muss aufgelöst werden. Sobald das Problem behoben ist, ist es in der GARCreateAnchorOnTerrainFuture verfügbar.

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

Die Zukunft prüfen

Der Future ist ein GARFutureState zugeordnet.

Status Beschreibung
GARFutureStatePending Der Vorgang steht noch aus.
GARFutureStateDone Der Vorgang ist abgeschlossen und das Ergebnis ist verfügbar.
GARFutureStateCancelled Der Vorgang wurde abgebrochen.

Status des Geländeankers des zukünftigen Ergebnisses prüfen

GARTerrainAnchorState gehört zum asynchronen Vorgang und ist Teil des endgültigen Future-Ergebnisses.

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

Dachdübel

Dachanker – Hero

Dachdübel sind eine Art Anker und sind den Geländedübeln oben sehr ähnlich. Der Unterschied besteht darin, dass Sie die Höhe über dem Dach angeben, nicht die Höhe über dem Gelände.

Dachanker mit der neuen Async API erstellen

Der Anker ist nicht sofort verfügbar und muss aufgelöst werden.

Rufen Sie GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error: auf, um einen Dachanker zu erstellen und zu platzieren. Ähnlich wie bei Geländeankern greifen Sie auch auf GARFutureState der Zukunft zu. Anschließend können Sie das Future-Ergebnis prüfen, um auf GARRooftopAnchorState zuzugreifen.

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

Die Zukunft prüfen

Der Zukunft ist ein GARFutureState zugeordnet, siehe Tabelle oben.

Dachankerstatus des zukünftigen Ergebnisses prüfen

Die GARRooftopAnchorState gehört zum asynchronen Vorgang und ist Teil des endgültigen Future-Ergebnisses.

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

Nächste Schritte