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 ARGeospatialCreatorAnchor Objekte im Bearbeitungsmodus von Unity. Dies kann nützlich sein, Erstellen mehrerer Anker aus einer vordefinierten Liste wie einer Tabelle oder einer KML-Datei -Datei.

Mit Geospatial Creator in Unity können Sie sich eine Vorschau raumbezogener Inhalte im Unity-Editor ansehen. Unsere Kurzanleitung stellt Geospatial Creator vor und zeigt, wie Sie Ihren ersten Raumbezogene AR-Funktionen mit minimalem Programmieraufwand mithilfe von Unity Editor-Benutzeroberfläche Bei komplexeren Projekten können Sie Geospatiale Creator-GameObjects werden programmatisch anstelle von Unity verwendet Editor-Benutzeroberfläche

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. Geospatial Creator muss aktiviert sein und die mit Ihren API-Schlüsseln konfiguriert sind, sowie die anfänglichen AR-Sitzungsobjekte in Ihrem Szene. Wenn Sie ganz von vorn beginnen, folgen Sie der Kurzanleitung bis einschließlich der „Räumlich-geografischen Daten aktivieren“ Creator“ bevor Sie fortfahren.

Erste Schritte

Nehmen wir für dieses Beispiel an, dass sich einige bekannte Orte um das Rathaus in der in dem Sie AR-Inhalte platzieren möchten. Sie müssen an jedem dieser Orte Ankerobjekte erstellen und diesen dann einfache Geometrie zuweisen.

Bevor Sie Anker erstellen können, müssen Sie ein ARGeospatialCreatorOrigin, der ein Bezugspunkt für die Konvertierung ist Breiten-, Längengrad- und Höhenangaben zu und von den Unity-Weltkoordinaten. Der Ursprung enthält außerdem eine CesiumGeoreference-Unterkomponente und eine Untergeordnetes Cesium3DTileset-Objekt, das es Cesium ermöglicht, die umgebende in der Szenenansicht des Unity-Editors. Dafür benötigen Sie eine Google Maps-Karte. Tiles API-Schlüssel, wie in den Kurzanleitung

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. Mit dem folgenden Code wird der Ursprung an einem nahe gelegenen Breiten-, Längengrad und Höhe und mithilfe des gegebenen Map Tiles API-Schlüssels:

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 raumbezogene Anker zur Laufzeit aufzulösen. benötigen auch einen Verweis auf das ARAnchorManager in der Szene. Wenn Sie mit die mit ARCore-Erweiterungen gebündelte Geospatial Sample-Anwendung, die Anchor Manager ist mit „Ursprung der AR-Sitzung“ verknüpft GameObject an. Angenommen, Sie haben genau einen Anchor-Manager in Ihrer Szene, können Sie so auf ihn verweisen:

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

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

Geländeanker erstellen

Betrachten Sie das folgende zweidimensionale double-Array, 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. Der folgende Code erstellt ARGeospatialCreatorAnchor-Objekten und weist ihre Eigenschaften dem geeignete Werte:

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 wird automatisch erstellt platziert die Anker an den entsprechenden Unity-Weltkoordinaten, indem ihre Standort relativ zum ARGeospatialCreatorOrigin-Objekt. So passen Sie die Höhe eines Geländeankers haben Sie die Eigenschaft Altitude in Metern über oder unter der Geländeoberfläche zu sehen.

Bei der Laufzeit werden Geländeanker auf Bodenhöhe für die laufende App aufgelöst, wobei sie um die Altitude-Property 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. Diese werden häufig nicht angezeigt, daher können Sie die Standardhöhe des Ankers in der Szenenansicht des Editors durch Festlegen des UseEditorAltitudeOverride auf true und gibt die Höhe in WGS84-Messgeräte mit der Eigenschaft EditorAltitudeOverride:

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

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

Raumanker im City Hall Plaza

Dachanker erstellen

Angenommen, Sie möchten als Nächstes einen Anker auf dem Dach des Rathauses platzieren. Der Anker kann auf die gleiche Weise erstellt werden, mit Ausnahme des AltitudeType-Objekts. ist auf AnchorAltitudeType.Rooftop festgelegt:

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 Szenenanzeige des Editors mithilfe der Properties UseEditorAltitudeOverride und EditorAltitudeOverride optimieren. In diesem Beispiel ist die WGS84-Höhe des beträgt ca.10,7 Meter.

Raumbezogener 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 ist die genaue Höhe wichtig, daher legen Sie sie explizit durch mit einem WGS84-Anker anstelle eines Gelände- oder Dachankers:

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;

Es ist nicht nötig, die reine Editor-Höhenüberschreibung zu verwenden, da die Höhe die bereits gemäß WGS84 angegeben sind. Wenn sich die Höhe der Kartenkacheln-Geometrie 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