在 Unity 的地理空間建立者中,透過程式輔助方式建立及編輯錨定標記

本指南說明如何使用地理空間創作者編寫 C# 指令碼 快速完成一般工作,例如建立及移動 ARGeospatialCreatorAnchor 物件。很適合用來 根據試算表或 KML 等預先定義的清單建立多個錨點 檔案。

Unity 的地理空間創作者功能,可讓你預覽 Unity 編輯器我們的快速入門指南 介紹地理空間創作者,並逐步引導你建立 使用 Unity,以最少的程式設計製作支援地理空間的 AR 體驗 編輯器 UI。對於較進階的專案,您可能會想以程式輔助方式建立及操作 Geospatial Creator 遊戲物件,而非使用 Unity 編輯器 UI。

本指南假設您已熟悉快速入門中介紹的基本地理空間創作者概念,並準備開始在場景中加入地理空間創作者錨點。您必須啟用 Geospatial Creator,並使用 API 金鑰和場景中的初始 AR 工作階段物件進行設定。如要從頭開始,請按照快速入門指南的說明操作, 包括「啟用地理空間」 創作者」 一節再繼續。

開始使用

在這個範例中,假設您在美國加州舊金山的市政廳附近有一系列已知地點,且您想在這些地點放置 AR 內容。您需要在這些位置建立錨點物件,然後將基本幾何圖形附加到這些錨點。

建立錨點之前,您應該先指定 ARGeospatialCreatorOrigin,是轉換的參考點 以及往返 Unity 世界座標的經緯度。 來源也會包含 CesiumGeoreference 子元件和 Cesium3DTileset 子項物件,可讓 Cesium 算繪周圍 位於 Unity 編輯器的場景檢視畫面中。為此,您需要 Google 地圖圖塊 API 金鑰,如快速入門所述

建立來源

Geospatial Creator 的 API 包含工廠方法,可在場景中建立 ARGeospatialCreatorOrigin,並新增必要的 Cesium 元件。下列程式碼會使用指定的 Map Tiles API 金鑰,在附近經緯度和高度建立原點:

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

根據預設,這個物件是放置於 Unity 世界座標中的 (0, 0, 0), 以這個例子來說也很有效

取得 ARAnchorManager 參考資料

您需要使用 ARAnchorManager 在執行階段解析地理空間錨點,因此您也需要在場景中參照 ARAnchorManager。如果您是從 ARCore 擴充功能隨附的地理空間範例應用程式開始,錨點管理工具會附加至「AR 工作階段原點」遊戲物件。假設您有 只要在場景中有一個錨點管理員,就能取得該場景的參考資源 :

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

您已擁有來源和錨點管理工具,因此可以開始建立 ARGeospatialCreatorAnchor 物件。

建立地形錨點

請考慮以下 double 值的二維陣列,代表美國加州舊金山市政廳東側三個點的確切緯度和經度:

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

假設您想在這些地點的地面上各放置一個公尺立方體 或是 AR 應用程式中以下程式碼會建立 ARGeospatialCreatorAnchor 物件,並將其屬性指派給適當的值:

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

這會在每個點建立地形錨點。地理空間建立者自動 透過計算 這是相對於 ARGeospatialCreatorOrigin 物件的位置。如要調整地形錨點的高度,請將 Altitude 屬性設為地形表面上方或下方的公尺。

在執行階段,地形錨點會在執行中的應用程式地面層級解析,並以 Altitude 屬性偏移。不過在編輯器的場景檢視畫面中 預設為 0 的 WGS84 高度 (不相對於 3D 圖塊) 幾何圖形這通常不是您想要看到的結果,因此您可以將 UseEditorAltitudeOverride 屬性設為 true,並使用 EditorAltitudeOverride 屬性指定 WGS84 公尺的高度,藉此在編輯器的場景檢視畫面中覆寫錨點的預設高度:

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

這兩個屬性在編輯器模式以外不會生效,也不會編譯至執行中的應用程式。

位於市政廳廣場的地理空間錨點

建立屋頂錨定廣告

針對下一個錨點,假設您想要在城市屋頂上放置一個錨點 哈囉。錨點的建立方式完全相同,只是 AltitudeType 屬性會設為 AnchorAltitudeType.Rooftop

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;

與地形錨點類似,您可以使用 UseEditorAltitudeOverrideEditorAltitudeOverride 屬性,在編輯器的場景檢視畫面中微調屋頂錨點的高度。在這個範例中,WGS84 海拔高度 屋頂是約 10.7 公尺。

屋頂上的地理空間錨點

在特定海拔高度建立錨點

我們的最後錨點將安排在市政廳圓頂的頂端。適用對象 這個錨點,精確的海拔高度很重要,所以您應該 使用 WGS84 錨點,而不是地形或屋頂錨:

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;

由於高度已根據 WGS84 指定,因此不需要使用僅限編輯器的高度覆寫值。當然,如果地圖圖塊高度 與現實世界相比,編輯器中的幾何形狀不正確。 你仍可使用編輯器覆寫值,在場景中重新調整錨點的位置 檢視畫面。

半球體上的地理空間錨點