Anker in Geospatial Creator in Unity programmatisch erstellen und bearbeiten

In diesem Leitfaden wird beschrieben, wie Sie mit Geospatial Creator C#-Scripts schreiben, um gängige Aufgaben wie das Erstellen und Verschieben von ARGeospatialCreatorAnchor-Objekten im Bearbeitungsmodus von Unity schnell auszuführen. Dies kann nützlich sein, wenn Sie mehrere Anker aus einer vordefinierten Liste wie einer Tabelle oder einer KML-Datei erstellen möchten.

Mit dem Geospatial Creator in Unity können Sie raumbezogene Inhalte im Unity-Editor in der Vorschau ansehen. In unserer Kurzanleitung wird Geospatial Creator vorgestellt und Sie erfahren, wie Sie mit der Unity Editor-UI mit minimalem Programmieraufwand Ihre erste Geospatial-fähige AR-Umgebung erstellen. Bei komplexeren Projekten können Sie Geospatial Creator GameObjects programmatisch erstellen und bearbeiten, anstatt die Benutzeroberfläche des Unity Editors zu verwenden.

In diesem Leitfaden wird davon ausgegangen, dass Sie mit den grundlegenden Konzepten von Geospatial Creator vertraut sind, die in der Kurzanleitung vorgestellt wurden, und bereit sind, einer Szene Geospatial Creator-Anker hinzuzufügen. Sie müssen Geospatial Creator aktiviert und mit Ihren API-Schlüsseln sowie den ersten AR-Sitzungsobjekten in Ihrer Szene konfiguriert sein. Wenn Sie bei null anfangen, folgen Sie der Kurzanleitung und fügen Sie den Abschnitt Geospatial Creator aktivieren hinzu, bevor Sie fortfahren.

Erste Schritte

Nehmen wir für dieses Beispiel an, Sie haben eine Reihe bekannter Orte rund um die City Hall in San Francisco, Kalifornien, USA, an denen Sie AR-Inhalte platzieren möchten. Sie müssen an jedem dieser Orte Ankerobjekte erstellen und diesen Ankern dann grundlegende Geometrie hinzufügen.

Bevor Sie Anker erstellen können, müssen Sie einen ARGeospatialCreatorOrigin angeben. Er ist ein Referenzpunkt zum Konvertieren von Breiten-, Längengraden und Höhen in und von Unity-Weltkoordinaten. Der Ursprung enthält außerdem eine CesiumGeoreference-Unterkomponente und ein untergeordnetes Cesium3DTileset-Objekt, mit dem Cesium den umgebenden Bereich in der Szenenansicht des Unity-Editors rendern kann. Dazu benötigst du einen Google MapTiles API-Schlüssel, wie in der Kurzanleitung beschrieben.

Ursprung erstellen

Die API für Geospatial Creator enthält eine Factory-Methode, um eine ARGeospatialCreatorOrigin in der Szene zu erstellen und die erforderlichen Cesium-Komponenten hinzuzufügen. Mit dem folgenden Code wird der Startort anhand des angegebenen Map Tiles API-Schlüssels an einem nahe gelegenen Breiten-, Längengrad und Höhepunkt erstellt:

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

Standardmäßig wird dieses Objekt bei (0, 0, 0) in Unity-Weltkoordinaten platziert, was für dieses Beispiel gut funktioniert.

ARAnchorManager-Referenz abrufen

Ein ARAnchorManager ist erforderlich, um raumbezogene Anker zur Laufzeit aufzulösen. Daher benötigen Sie auch einen Verweis auf das ARAnchorManager in der Szene. Wenn Sie mit der Geospatial Sample App begonnen haben, die mit ARCore-Erweiterungen gebündelt ist, wird der Anchor Manager an das GameObject „AR Session Origin“ angehängt. Wenn Sie genau einen Anchor-Manager in Ihrer Szene haben, können Sie so einen Verweis darauf abrufen:

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

Da Sie nun einen Ursprung und einen Ankermanager haben, können Sie mit dem Erstellen der ARGeospatialCreatorAnchor-Objekte beginnen.

Geländeanker erstellen

Sehen Sie sich das folgende zweidimensionale Array von double-Werten an, das den genauen Breiten- und Längengrad an drei Punkten an der östlichen Seite der City Hall in San Francisco, Kalifornien, USA, darstellt:

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

Angenommen, Sie möchten an jedem dieser Standorte in unserer AR-Anwendung auf Bodenhöhe einen 1-Meter-Würfel platzieren. Mit dem folgenden Code werden ARGeospatialCreatorAnchor-Objekte erstellt und ihre Attribute den entsprechenden Werten zugewiesen:

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

Dadurch werden an jedem Punkt Geländeanker erstellt. Geospatial Creator platziert die Anker automatisch an den entsprechenden Unity-Weltkoordinaten, indem ihre Position relativ zum ARGeospatialCreatorOrigin-Objekt berechnet wird. Wenn Sie die Höhe eines Geländeankers anpassen möchten, geben Sie die Eigenschaft Altitude in Metern über oder unter der Geländeoberfläche an.

Zur Laufzeit werden Geländeanker auf Bodenhöhe für die ausgeführte App aufgelöst, wobei der Abstand durch die Eigenschaft Altitude angegeben wird. In der Szenenansicht des Editors werden sie jedoch standardmäßig in einer WGS84-Höhe von 0 gerendert, nicht relativ zur 3D-Kachelgeometrie. Dies ist häufig nicht der Fall, wo Sie sie sehen möchten. Daher können Sie die Standardhöhe des Ankers in der Szenenansicht des Editors überschreiben. Dazu setzen Sie die Eigenschaft UseEditorAltitudeOverride auf true und geben die Höhe in WGS84-Metern mithilfe der Eigenschaft EditorAltitudeOverride an:

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

Diese beiden Attribute haben außerhalb des Editormodus keine Auswirkungen und werden nicht in der laufenden Anwendung kompiliert.

Geodaten-Anker auf dem Rathausplatz

Dachanker erstellen

Für den nächsten Anker nehmen wir an, Sie möchten einen Anker auf dem Dach der Stadthalle platzieren. Auf dieselbe Weise kann das Ankerelement erstellt werden, mit der Ausnahme, dass das Attribut AltitudeType auf AnchorAltitudeType.Rooftop gesetzt ist:

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;

Ähnlich wie bei „Geländeanker“ können Sie die Höhe eines Ankers auf dem Dach in der Szenenansicht des Editors mithilfe der Eigenschaften UseEditorAltitudeOverride und EditorAltitudeOverride anpassen. In diesem Beispiel beträgt die WGS84-Dachhöhe etwa 10, 7 Meter.

Geodaten-Anker auf dem Dach

Anker in einer bestimmten Höhe erstellen

Unser letzter Anker wird ganz oben auf der Kuppel des Rathauses platziert. Für diesen Anker ist die genaue Höhe wichtig. Sie legen sie daher explizit fest, indem Sie einen WGS84-Anker anstelle eines Gelände- oder Ankerankers verwenden:

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;

Die nur für den Editor vorgesehene Höhenüberschreibung muss nicht verwendet werden, da die Höhe gemäß WGS84 bereits angegeben ist. Wenn sich die Höhe der Kartenkachel-Geometrie im Editor im Vergleich zur realen Welt als falsch herausstellt, können Sie den Anker trotzdem mit der Überschreibung des Editors in der Szenenansicht neu positionieren.

Geodaten-Anker an der Kuppel