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.
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.
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.