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ızla yerine getirmek amacıyla C# komut dosyaları yazmak için Geospatial Creator'ın nasıl kullanılacağı açıklanmaktadır. Bu özellik, e-tablo veya KML dosyası gibi önceden tanımlanmış bir listeden birden fazla bağlayıcı oluşturmak için yararlı olabilir.

Unity'deki Geospatial Creator, Coğrafi içeriği Unity Düzenleyici'de önizlemenizi sağlar. Hızlı Başlangıç Kılavuzumuz Geospatial Creator'ı tanıtıyor ve Unity Editor kullanıcı arayüzünü kullanarak Geospatial özellikli ilk AR deneyiminizi minimum programlamayla nasıl oluşturacağınızı adım adım gösteriyor. Daha gelişmiş projeler için Unity Editor kullanıcı arayüzünü kullanmak yerine Geospatial Creator GameObjects öğelerini programatik olarak oluşturmak ve değiştirmek isteyebilirsiniz.

Bu kılavuzda, Hızlı Başlangıç Kılavuzu'nda açıklanan temel Coğrafi İçerik Oluşturucu kavramlarına aşina olduğunuz ve bir sahneye Coğrafi İçerik Oluşturucu çapaları eklemeye hazır olduğunuz varsayılır. Bunun için Geospatial Creator'ı etkinleştirmeniz ve API anahtarlarınızla ve sahnenizdeki ilk AR oturumu nesnelerini yapılandırmış olmanız gerekir. Sıfırdan başlıyorsanız devam etmeden önce Hızlı Başlangıç kılavuzundaki talimatları uygulayarak "Coğrafi Mekansal İçerik Oluşturucuyu Etkinleştir" bölümünü inceleyin.

Başlarken

Bu örnekte, San Francisco, Kaliforniya, ABD'deki Belediye Binası çevresinde AR içeriği yerleştirmek istediğiniz bir dizi bilinen konumunuz olduğunu varsayalım. Bu konumların her birinde çapa nesneleri oluşturmanız ve daha sonra bu sabitleyicilere temel geometriyi eklemeniz gerekir.

Çapa oluşturabilmeniz için öncelikle bir ARGeospatialCreatorOrigin belirtmelisiniz. Bu, enlemleri, boylamları ve rakımları Unity dünya koordinatlarına ve bu koordinatlardan diğerine dönüştürmek için kullanılacak bir referans noktasıdır. Kaynak ayrıca bir CesiumGeoreference alt bileşeni ve bir Cesium3DTileset alt nesnesi içerir. Böylece Cesium, Unity düzenleyicinin Scene görünümünde etrafındaki alanı oluşturabilir. Bunun için, Hızlı Başlangıç Kılavuzu'nda açıklandığı gibi bir Google MapTiles API anahtarına ihtiyacınız vardır.

Kaynak Oluştur

Geospatial Creator API'si, sahnede bir ARGeospatialCreatorOrigin oluşturmak ve gerekli Cesium bileşenlerini eklemek için fabrikada kullanılan bir yöntem içerir. Aşağıdaki kod, verilen Map Tiles API anahtarını kullanarak başlangıç noktasını yakındaki bir enlem, boylam ve rakımda oluşturur:

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

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

ARAnchorManager Referansını Edinin

Coğrafi çapaların çalışma zamanında çözümlenmesi için bir ARAnchorManager gereklidir. Bu nedenle, sahnedeki ARAnchorManager referansına da ihtiyacınız olur. ARCore Uzantılarıyla paket halinde sunulan Geospatial Sample uygulamasını kullanmaya başladıysanız, Anchor Manager "AR Session Origin" GameObject'e eklenir. Sahnenizde tam olarak bir sabit yönetici olduğunu varsayarsak buna aşağıdaki şekilde bir referans alabilirsiniz:

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

Artık bir kaynağınız ve bir bağlayıcı yöneticiniz olduğuna göre ARGeospatialCreatorAnchor nesnelerini oluşturmaya başlayabilirsiniz.

Arazi çapaları oluşturun

ABD'nin Kaliforniya eyaletinin San Francisco şehrindeki Belediye Binası'nın doğu tarafındaki üç noktada kesin enlem ve boylamı temsil eden aşağıdaki iki boyutlu double değerleri 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

AR uygulamamızda, yer seviyesinde bu konumların her birine bir metre küp yerleştirmek istediğinizi varsayalım. Aşağıdaki kod ARGeospatialCreatorAnchor nesneleri oluşturur ve bunların özelliklerini uygun değerlere atar:

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

Böylece her noktada arazi çapaları oluşturulur. Coğrafi İçerik Oluşturucu, çapaların ARGeospatialCreatorOrigin nesnesiyle göreli konumunu hesaplayarak çapaları uygun Unity dünya koordinatlarına otomatik olarak yerleştirir. Bir arazi çapasının rakımını ayarlamak için Altitude özelliğini arazi yüzeyinin metre cinsinden üstünde veya altında olacak şekilde ayarlayın.

Çalışma zamanında arazi çapaları, çalışan uygulama için yer seviyesinde çözümlenir ve Altitude özelliği ile belirlenir. Ancak bu öğeler, Düzenleyici'nin sahne görünümünde 3D karo geometrisine göre değil, varsayılan olarak 0 WGS84 rakımıyla oluşturulur. Bu genellikle bunları görmek istediğiniz yer değildir. Bu nedenle, UseEditorAltitudeOverride özelliğini true olarak ayarlayıp EditorAltitudeOverride özelliğini kullanarak WGS84 metre cinsinden yüksekliği belirterek Düzenleyici'nin sahne görünümünde sabit reklamın varsayılan rakımını geçersiz kılabilirsiniz:

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 etkisi yoktur ve çalışan uygulamada derlenmez.

Belediye Binası Meydanı&#39;nda Coğrafi Çapa

Çatı çapası oluşturun

Bir sonraki bağlantı noktamız için City Hall'un çatısına bir çapa yerleştirmek istediğinizi varsayalım. Anchor, AltitudeType özelliğinin AnchorAltitudeType.Rooftop değerine ayarlanması dışında 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, UseEditorAltitudeOverride ve EditorAltitudeOverride özelliklerini kullanarak Düzenleyici'nin sahne görünümünde bir çatı sabitinin rakımının ince ayarını yapabilirsiniz. Bu örnekte, WGS84'ün çatısının rakımı yaklaşık 10,7 metredir.

Çatıda coğrafi mekansal çapa

Belirli bir rakımda çapa oluşturma

Nihai çapamız Belediye Sarayı'nın kubbesinin en tepesine yerleştirilecektir. Bu çapa için rakım tam olarak önemlidir. Bu yüzden, arazi veya çatı çapası yerine WGS84 çapası kullanarak bunu açıkça belirlemelisiniz:

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;

Rakım zaten WGS84'e göre belirtildiğinden, yalnızca düzenleyicinin kullanabileceği rakım geçersiz kılma işlevini kullanmanıza gerek yoktur. Elbette, düzenleyicideki Harita Kutuları geometrisinin yüksekliği gerçek dünyaya kıyasla yanlış ortaya çıkarsa, çapa yerini sahne görünümünde yeniden konumlandırmak için düzenleyici geçersiz kılma özelliğini kullanabilirsiniz.

Kubbedeki coğrafi mekansal çapa