Unity'deki Geospatial Creator'da programatik olarak çapa oluşturma ve düzenleme

Bu kılavuzda, Unity'nin Düzenleme modunda ARGeospatialCreatorAnchor nesneleri oluşturma ve taşıma gibi yaygın görevleri hızlıca tamamlamak için C# komut dosyaları yazmak üzere Geospatial Creator'ın nasıl kullanılacağı açıklanmaktadır. Bu, elektronik tablo veya KML dosyası gibi önceden tanımlanmış bir listeden birden fazla ankraj oluşturmak için yararlı olabilir.

Unity'deki Geospatial Creator, Unity Editor'da coğrafi içeriği önizlemenize olanak tanır. Hızlı Başlangıç Kılavuzumuzda Coğrafi Oluşturucu'yu tanıtıyoruz ve Unity Editor kullanıcı arayüzünü kullanarak minimum düzeyde programlamayla ilk coğrafi bilgi destekli AR deneyiminizi nasıl oluşturacağınız konusunda size yol gösteriyoruz. Daha gelişmiş projelerde ise proje paydaşlarıyla, Unity'yi kullanmak yerine Geo-uzaysal Oluşturucu Oyun Nesneleri'ni (programatik olarak) Düzenleyici kullanıcı arayüzü.

Bu kılavuzda, Hızlı Başlangıç bölümünde açıklanan temel Geospatial Creator kavramlarına aşina olduğunuz ve bir sahneye Geospatial Creator ankrajları eklemeye hazır olduğunuz varsayılmaktadır. Geospatial Creator'ı etkinleştirmeniz ve ve sahne. Baştan başlıyorsanız devam etmeden önce Hızlı Başlangıç Kılavuzu'ndaki "Coğrafi Veri Oluşturucu'yu etkinleştirme" bölümünü de dahil olmak üzere kılavuzu uygulayın.

Başlarken

Bu örnekte, ABD'nin Kaliforniya eyaletinin San Francisco şehrindeki Belediye Binası çevresinde, AR içeriği yerleştirmek istediğiniz bilinen bir dizi konum olduğunu varsayalım. Bu konumların her birinde ankraj nesneleri oluşturmanız ve ardından bu ankrajlara temel geometri eklemeniz gerekir.

Bağlayıcı oluşturabilmeniz için önce ARGeospatialCreatorOrigin, dönüşüm için bir referans noktasıdır Unity dünya koordinatlarına karşılık gelen enlem, boylam ve rakımları görebilirsiniz. Köken, bir CesiumGeoreference alt bileşeni ve Cesium3DTileset alt nesnesi de içerir. Bu, Cesium'un Unity düzenleyicisinin Sahne görünümünde çevredeki alanı oluşturmasına olanak tanır. Bunun için Hızlı Başlangıç bölümünde açıklandığı şekilde bir Google Haritalar Kartları API anahtarına ihtiyacınız vardır.

Kaynak Oluşturma

Geospatial Creator API'si, sahnede ARGeospatialCreatorOrigin oluşturmak ve gerekli Cesium bileşenlerini eklemek için bir fabrika yöntemi içerir. Aşağıdaki kod, belirtilen Map Tiles API anahtarını kullanarak yakın bir enlem, boylam ve rakımda orijin oluşturur:

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

Bu nesne varsayılan olarak Unity dünya koordinatlarında (0, 0, 0) yerleştirilir. Bu örnek için bu konum uygundur.

ARAnchorManager referansını alma

ARAnchorManager coğrafi çapaları çalışma zamanında çözmek için gereklidir. Böylece, sahnedeki ARAnchorManager öğesine de referans verilmesi gerekir. ARCore Uzantıları ile paket halinde sunulan Geospatial Sample uygulaması, Yönetici, "AR Oturumu Kaynağı"na eklenmiş GameObject'i tıklayın. Sahnenizde tam olarak bir ana yöneticiniz olduğunu varsayarak aşağıdaki gibi bir referans alabilirsiniz:

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

Artık bir kaynağınız ve bağlayıcı yöneticiniz olduğuna göre ARGeospatialCreatorAnchor nesne.

Arazi bağlayıcıları oluşturma

ABD, Kaliforniya, San Francisco'daki Belediye Binası'nın doğuya bakan tarafındaki üç noktadaki tam enlem ve boylamı temsil eden aşağıdaki iki boyutlu double değer dizisini düşünün:

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

Bu konumların her birine, zemine bir metre küp yerleştirmek istediğinizi varsayalım seviyesinde çok çalışıyoruz. Aşağıdaki kod, ARGeospatialCreatorAnchor nesneleri belirler ve özelliklerini uygun değerlere sahip olduğundan emin olun:

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

Bu işlem, her noktada arazi çapaları oluşturur. Coğrafi Oluşturucu, ARGeospatialCreatorOrigin nesnesine göre konumlarını hesaplayarak sabit noktaları otomatik olarak uygun Unity dünya koordinatlarına yerleştirir. Bir arazi sabit noktasının yüksekliğini ayarlamak için Altitude mülkünü arazi yüzeyinin üstünde veya altında metre cinsinden ayarlayın.

Çalışma zamanında, arazi çapaları koşu uygulaması için zemin düzeyinde çözümlenir. Altitude özelliği tarafından uzaklaştırılır. Ancak Düzenleyici'nin sahne görünümünde, 3D karo geometrisine göre değil, varsayılan olarak 0 WGS84 yüksekliğinde oluşturulurlar. Bunları genellikle görmek istediğiniz yer değildir. Bu nedenle, Düzenleyici'nin sahne görünümünde sabit reklamın varsayılan rakımını UseEditorAltitudeOverride mülkü, true bölgesine ait ve rakımı şu şekilde belirtiyor: EditorAltitudeOverride mülkünü kullanarak WGS84 metre:

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

Bu iki özelliğin Düzenleyici modu dışında herhangi bir etkisi yoktur ve çalışan uygulamada derlenir.

City Hall Plaza&#39;da Coğrafi Çapa

Çatı çapası oluşturma

Bir sonraki yer işaretimiz için Belediye Sarayı'nın çatısına yer işareti yerleştirmek istediğinizi varsayalım. AltitudeType mülkü AnchorAltitudeType.Rooftop olarak ayarlandığından hariç, ankraj tam olarak aynı şekilde oluşturulabilir:

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;

Arazi çapalarına benzer şekilde, bir çatının rakımında ince ayar yapabilirsiniz UseEditorAltitudeOverride ve düğmeleri kullanarak Düzenleyici'nin sahne görünümüne sabitleyin EditorAltitudeOverride mülk. Bu örnekte, çatıya ait WGS84 yüksekliği yaklaşık 10,7 metredir.

Çatıda Coğrafi Çapa

Belirli bir rakımda çapa oluşturma

Son sabitleme noktamız, Belediye Binası'nın kubbesinin en üstüne yerleştirilecek. Örneğin, olduğu için, tam rakım önemlidir. Bu nedenle, istediğiniz rakıma arazi veya çatı çapası yerine bir WGS84 çapası kullanarak:

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;

Yükseklik zaten WGS84'e göre belirtildiğinden, yalnızca düzenleyiciye yönelik yükseklik geçersiz kılma özelliğini kullanmanız gerekmez. Elbette, Harita Karolarının yüksekliği editördeki geometrinin gerçek dünyaya kıyasla yanlış olduğu ortaya çıktı. Sahnedeki bağlayıcıyı yeniden konumlandırmak için düzenleyicinin geçersiz kılmasını kullanmaya devam edebilirsiniz. görünüm.

Kubbede coğrafi konumlandırma noktası