Anker in Geospatial Creator in Unity programmatisch erstellen und bearbeiten

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

Mit Geospatial Creator in Unity können Sie sich eine Vorschau raumbezogener Inhalte im Unity-Editor ansehen. In unserer Kurzanleitung wird Geospatial Creator vorgestellt und Sie erfahren, wie Sie mit minimalem Programmieraufwand über die Unity-Benutzeroberfläche Ihre erste geospatiale AR-Anwendung erstellen. Bei komplexeren Projekten sollten Sie Geospatial Creator-Gameobjects programmatisch erstellen und bearbeiten, anstatt die Unity-Benutzeroberfläche 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 dass Sie bereit sind, einer Szene Geospatial Creator-Markierungen hinzuzufügen. Sie müssen Geospatial Creator aktiviert und mit Ihren API-Schlüsseln konfiguriert haben sowie die ersten AR-Sitzungsobjekte in Ihrer Szene platziert haben. Wenn Sie ganz neu beginnen, folgen Sie der Kurzanleitung bis zum Abschnitt Geospatial Creator aktivieren und fahren Sie dann fort.

Erste Schritte

Angenommen, Sie haben eine Reihe bekannter Orte rund um das Rathaus in San Francisco, Kalifornien, USA, an denen Sie AR-Inhalte platzieren möchten. Sie müssen an jedem dieser Orte Ankerobjekte erstellen und dann an diese Anker grundlegende Geometrie anhängen.

Bevor Sie Markierungen erstellen können, sollten Sie einen ARGeospatialCreatorOrigin angeben. Dies ist ein Referenzpunkt für die Umwandlung von Breiten-, Längen- und Höhengraden in und aus Unity-Weltkoordinaten. Der Ursprung enthält außerdem eine CesiumGeoreference-Unterkomponente und ein Cesium3DTileset-untergeordnetes Objekt, mit denen Cesium den umgebenden Bereich in der Szenenanzeige des Unity-Editors rendern kann. Dazu benötigen Sie einen Google Maps Tiles API-Schlüssel, wie in der Schnellstartanleitung beschrieben.

Ursprung erstellen

Die API für Geospatial Creator enthält eine Fabrikmethode, mit der eine ARGeospatialCreatorOrigin in der Szene erstellt und die erforderlichen Cesium-Komponenten hinzugefügt werden können. Im folgenden Code wird der Ursprung mit einer nahe gelegenen geographischen Breite, Länge und Höhe und mit dem angegebenen Map Tiles API-Schlüssel erstellt:

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

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

ARAnchorManager-Referenz abrufen

Ein ARAnchorManager ist erforderlich, um geografische Anker zur Laufzeit aufzulösen. Daher ist auch eine Referenz auf den ARAnchorManager in der Szene erforderlich. Wenn Sie mit der in ARCore Extensions enthaltenen Beispielanwendung für raumbezogene Daten begonnen haben, ist der Anchor Manager mit dem Gameobject „AR Session Origin“ verknüpft. Angenommen, Sie haben genau einen Anchor-Manager in Ihrer Szene, können Sie so auf ihn verweisen:

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

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

Geländeanker erstellen

Betrachten Sie das folgende zweidimensionale Array mit double-Werten, das die genaue geografische Breite und Länge an drei Punkten auf der ostseitigen Seite des Rathauses 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 in unserer AR-Anwendung an jedem dieser Orte auf Bodenhöhe einen Würfel mit einem Meter Kantenlänge platzieren. Im folgenden Code werden ARGeospatialCreatorAnchor-Objekte erstellt und ihren Eigenschaften die entsprechenden Werte 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 er ihren Standort relativ zum ARGeospatialCreatorOrigin-Objekt berechnet. Wenn Sie die Höhe eines Geländeankers anpassen möchten, legen Sie die Eigenschaft Altitude in Metern über oder unter der Geländeoberfläche fest.

Bei der Laufzeit werden Geländeanker für die laufende App auf Bodenhöhe aufgelöst, wobei sie um die Altitude-Eigenschaft versetzt werden. In der Szenenansicht des Editors werden sie jedoch standardmäßig mit einer WGS84-Höhe von 0 gerendert, nicht relativ zur Geometrie der 3D-Kachel. Das ist oft nicht die gewünschte Position. Sie können die Standardhöhe des Ankers in der Szenenanzeige des Editors überschreiben, indem Sie die Property UseEditorAltitudeOverride auf true festlegen und die Höhe in Metern (WGS84) mit der Property EditorAltitudeOverride angeben:

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

Diese beiden Eigenschaften haben außerhalb des Editor-Modus keine Auswirkungen und werden nicht in die laufende App kompiliert.

Geospatial Anchor in City Hall Plaza

Dachanker erstellen

Angenommen, Sie möchten als Nächstes einen Anker auf dem Dach des Rathauses platzieren. Der Anker kann auf genau dieselbe Weise erstellt werden, mit der Ausnahme, dass das Attribut AltitudeType auf AnchorAltitudeType.Rooftop festgelegt 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 den Geländeankern können Sie die Höhe eines Dachankers in der Szenenansicht des Editors mithilfe der Eigenschaften UseEditorAltitudeOverride und EditorAltitudeOverride optimieren. In diesem Beispiel beträgt die Höhe des Daches in WGS84 etwa 10, 7 Meter.

Georeferenzierter Anker auf dem Dach

Anker auf einer bestimmten Höhe erstellen

Der letzte 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 anstelle eines Gelände- oder Dachankers einen WGS84-Anker 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 Höhe muss nicht überschrieben werden, da sie bereits gemäß WGS84 angegeben ist. Wenn sich die Höhe der Kartenkacheln im Editor im Vergleich zur realen Welt als falsch herausstellt, können Sie den Anker natürlich auch über die Override-Funktion im Editor in der Szenenansicht neu positionieren.

Georeferenzierter Anker auf der Kuppel