Georeferenzierte Anker sind eine Art von Anker, mit denen Sie 3D-Inhalte in der realen Welt platzieren können.
Arten von geografischen Markierungen
Es gibt drei Arten von geografischen Markierungen, die die Höhe unterschiedlich handhaben:
WGS84-Markierungen:
Mit WGS84-Markierungen können Sie 3D-Inhalte an einem beliebigen Breiten-, Längen- und Höhengrad platzieren.Terrain-Markierungen:
Mithilfe von Terrain-Markierungen können Sie Inhalte nur mithilfe von Breiten- und Längengrad sowie einer Höhe relativ zum Gelände an dieser Position platzieren. Die Höhe wird relativ zum Boden oder zur Etage bestimmt, wie sie VPS bekannt ist.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 bestimmten Geländehöhe | 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 zum Erstellen. 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 Pose aus dem Treffertest und wandeln Sie sie in eine GeospatialPose
um. Damit können Sie einen der drei beschriebenen Ankertypen platzieren.
Geospatiale Pose aus einer AR-Pose abrufen
AREarthManager.Convert(Pose)
bietet eine zusätzliche Möglichkeit, den Breiten- und Längengrad zu bestimmen, indem eine AR-Pose in eine raumbezogene Pose umgewandelt wird.
AR-Pose aus einer geospatialen Pose abrufen
AREarthManager.Convert(GeospatialPose)
wandelt eine von der Erde angegebene horizontale Position, Höhe und Quaternionsdrehung bezogen auf einen Koordinatenrahmen (Osten-Oben-Süd) in eine AR-Pose bezogen auf die GL-Weltkoordinate um.
Methode für Ihren Anwendungsfall auswählen
Jede Methode zum Erstellen eines Ankers hat Vor- und Nachteile, die Sie berücksichtigen sollten:
- Wenn Sie Streetscape-Geometrie verwenden, können Sie Inhalte mithilfe eines Treffertests an ein Gebäude anhängen.
- 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 können Sie sich die Welt mit 3D-Inhalten ansehen und ergänzen, ohne sich an einen bestimmten Ort begeben zu müssen. So können Sie immersive 3D-Inhalte mithilfe von Google Maps im Unity-Editor visuell platzieren. Breiten- und Längengrad, Drehung und Höhe der Inhalte 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:
Rufen Sie auf Ihrem Computer Google Maps auf.
Klicken Sie auf Ebenen > Dreipunkt-Menü.
Ä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, die durch eine geneigte 3D-Ansicht entstehen können, werden vermieden.
Klicken Sie auf der Karte mit der rechten Maustaste auf den gewünschten Ort und wählen Sie die Längen-/Breitengrade aus, um sie in die Zwischenablage zu kopieren.
Google Earth verwenden
Sie können den Breiten- und Längengrad eines Standorts in Google Earth berechnen, indem Sie in der Benutzeroberfläche auf einen Standort klicken und die Daten aus den Details der Ortsmarkierung lesen.
So rufen Sie mit Google Earth den Breiten- und Längengrad eines Orts ab:
Rufen Sie auf Ihrem Computer Google Earth auf.
Öffnen Sie das Dreistrich-Menü und wählen Sie Kartenstil aus.
Deaktivieren Sie den Schalter 3D-Gebäude.
Nachdem Sie den Schalter 3D-Gebäude deaktiviert haben, klicken Sie auf das Markierungssymbol , um am ausgewählten Standort eine Ortsmarkierung hinzuzufügen.
Geben Sie ein Projekt an, das Ihre Ortsmarkierung enthalten soll, und klicken Sie auf Speichern.
Geben Sie im Feld Titel einen Namen für die Ortsmarkierung ein.
Klicken Sie im Projektbereich auf den Zurückpfeil und wählen Sie das Dreipunkt-Menü Weitere Aktionen aus.
Wählen Sie im Menü die Option 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 sich dorthin begeben und eine lokale Beobachtung vornehmen.
Quaternion für die Rotation abrufen
GeospatialPose.EunRotation
extrahiert die Ausrichtung aus einer geospatialen Pose und gibt einen Quaternion aus, der die Rotationsmatrix darstellt, die einen Vektor vom Ziel in das Koordinatensystem „Ost-Oben-Nord“ (OUN) transformiert. X+ zeigt nach Osten, Y+ nach oben weg von der Schwerkraft und Z+ nach Norden.
WGS84-Anker
Ein WGS84-Anchor ist eine Art Anchor, mit dem Sie 3D-Inhalte an einem beliebigen Breiten-, Längen- und Höhengrad platzieren können. Es benötigt eine Pose und eine Ausrichtung, um in der realen Welt platziert zu 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 dem Boden liegt. Ihre App muss diese Koordinaten für jeden erstellten Anker bereitstellen.
WGS84-Anker in der realen Welt platzieren
Höhe eines Ortes ermitteln
Es gibt mehrere Möglichkeiten, die Höhe eines Standorts für das Setzen von Markierungen 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
GeospatialPose
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
GeospatialPose
der Kamera verwenden, ohne eine andere Quelle wie die Maps API zu verwenden.
Anker erstellen
Wenn Sie den Breiten- und Längengrad, die Höhe und das Quaternion für die Drehung haben, können Sie mit ARAnchorManagerExtensions.AddAnchor()
Inhalte an den von Ihnen angegebenen geografischen Koordinaten verankern.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
Geländeanker
Ein Geländeanker ist eine Art Anker, mit dem Sie AR-Objekte nur mithilfe von Längen- und Breitengraden platzieren können. Die genaue Höhe über dem Boden wird anhand von Informationen aus dem VPS ermittelt.
Anstatt die gewünschte Höhe einzugeben, geben Sie die Höhe über dem Gelände an. Wenn dieser Wert null ist, liegt der Anker auf 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 auf dem Boden.
Hinweis: Geländeanker sind von Horizontal
und Horizontal | Vertical
betroffen.
Legen Sie im Drop-down-Menü Erkennungsmodus den Erkennungsmodus fest:
Geländeanker mit der neuen Async API erstellen
Rufen Sie ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
auf, um einen Geländeanker zu erstellen und zu platzieren.
Der Anker ist nicht sofort verfügbar und muss aufgelöst werden. Sobald das Problem behoben ist, ist es in der ResolveAnchorOnTerrainPromise
verfügbar.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Status der Zusicherung prüfen
Der Zusicherung ist eine PromiseState
zugeordnet.
Status | Beschreibung |
---|---|
Pending |
Der Vorgang steht noch aus. |
Done |
Der Vorgang ist abgeschlossen und das Ergebnis ist verfügbar. |
Cancelled |
Der Vorgang wurde abgebrochen. |
Status des Geländeankers des Promise-Ergebnisses prüfen
Die TerrainAnchorState
gehört zum asynchronen Vorgang und ist Teil des endgültigen Promise-Ergebnisses.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
Dachanker
Dachanker sind eine Art Anker und ähneln den oben beschriebenen Geländeankern. 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 ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
auf, um einen Dachanker zu erstellen und zu platzieren. Ähnlich wie bei Geländeankern greifen Sie auch auf die PromiseState
der Zusicherung zu. Anschließend kannst du das Promise-Ergebnis prüfen, um auf die RooftopAnchorState
zuzugreifen.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Status der Zusicherung prüfen
Der Zusicherung ist eine PromiseState
zugeordnet (siehe Tabelle oben).
Dachankerstatus des Promise-Ergebnisses prüfen
Die RooftopAnchorState
gehört zum asynchronen Vorgang und ist Teil des endgültigen Promise-Ergebnisses.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
Nächste Schritte
- Informieren Sie sich über das Kontingent für die Nutzung der Geospatial API.