iOS'te gerçek dünyadaki içerikleri konumlandırmak için coğrafi bağlantıları kullanma

Coğrafi sabitleyiciler, 3D içerikleri gerçek dünyaya yerleştirmenize olanak tanıyan bir sabitleyici türüdür.

Coğrafi çapa türleri

Her biri rakımı farklı şekilde ele alan üç tür Coğrafi çapa vardır:

  1. WGS84 ankrajları:
    WGS84 ankrajları, 3D içeriği herhangi bir enlem, boylam ve yüksekliğe yerleştirmenize olanak tanır.

  2. Arazi çapaları:
    Arazi sabitleri, içeriği yalnızca enlem ve boylam değerlerini kullanarak boylam, söz konusu konumdaki araziye göre yüksekliğidir. Yükseklik, VPS tarafından bilinen zemin veya katla ilgili olarak belirlenir.

  3. Çatı bağlantı noktaları:
    Çatı bağlantı noktaları, yalnızca enlem ve boylam kullanarak bir binanın çatısına göre yükseklik değeriyle içerik yerleştirmenize olanak tanır. Rakım, binanın bilinen tepesine göre belirlenir Streetscape Geometri'ye göre belirlenir. Bu değer, bir binaya yerleştirilmediğinde varsayılan olarak arazi rakımı olur.

WGS84 Arazi Araç Tavanı
Yatay Konum Enlem, Boylam Enlem, Boylam Enlem, Boylam
Dikey Konum WGS84 yüksekliğine göre Google Haritalar tarafından belirlenen arazi seviyesine göre Google Haritalar tarafından belirlenen çatı seviyesine göre
Sunucu çözümlemesi mi gerekiyor? Hayır Evet Evet

Ön koşullar

Devam etmeden önce Geospatial API'yi etkinleştirdiğinizden emin olun.

Coğrafi konum çapaları yerleştirme

Her ankraj türünün oluşturulması için özel API'leri vardır. Daha fazla bilgi için Coğrafi ankraj türleri bölümüne bakın.

Hit-test'ten bir çapa oluşturma

Bir isabet testi sonucundan Coğrafi konum sabiti de oluşturabilirsiniz. İsabet testi dönüşümünü kullanın ve bunu bir GARGeospatialTransform öğesine dönüştürün. Açıklanan 3 sabitleyici türünden herhangi birini yerleştirmek için bunu kullanın.

AR Dönüşümünden Coğrafi Dönüşüm Alma

GARSession.geospatialTransformFromTransform:error:, bir AR Dönüşümünü Coğrafi Dönüşüm'e dönüştürerek enlem ve boylamı belirlemenin ek bir yolunu sunar.

Coğrafi Dönüşüm'den AR Dönüşüm alma

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error:, doğu-güney koordinat çerçevesine göre Dünya tarafından belirtilen yatay konumu, rakımı ve dörtlü dönüşü GL dünya koordinatına göre AR Dönüşümüne dönüştürür.

Kullanım alanınıza uygun yöntemi seçin

Çapa oluşturmanın her yönteminin göz önünde bulundurulması gereken belirli artıları vardır:

  • Sokak Görünüm Geometrisi'ni kullanırken bir binaya içerik eklemek için isabet testi kullanın.
  • Google Haritalar tarafından belirlenen rakım değerlerini kullandıklarından, WGS84 çapaları yerine Arazi veya Çatı çapalarını tercih edin.

Bir yerin enlem ve boylamını belirleme

Bir konumun enlem ve boylamını hesaplamanın üç yolu vardır:

  • Dünyayı fiziksel olarak bir yere gitmek zorunda kalmadan 3D içerikle görüntülemek ve geliştirmek için Geospatial Creator'ı kullanın. Bu sayede Unity Editor'da Google Haritalar'ı kullanarak görsel olarak etkileyici 3D içerikler yerleştirebilirsiniz. İçeriğin enlemi, boylamı, dönüşü ve yüksekliği sizin için otomatik olarak hesaplanır.
  • Google Haritalar'ı kullan
  • Google Earth'ü kullanın. Bu koordinatları Google Haritalar yerine Google Earth'ü kullanarak almanın, birkaç metrelik bir hata payına neden olacağını unutmayın.
  • Fiziksel konuma gidin

Google Haritalar'ı kullan

Google Haritalar'ı kullanarak bir konumun enlem ve boylamını öğrenmek için:

  1. Masaüstü bilgisayarınızda Google Haritalar'a gidin.

  2. Katmanlar > Diğer'e gidin.

  3. Harita Türü'nü Uydu olarak değiştirin ve ekranın sol alt köşesindeki Yerküre Görünümü onay kutusunu temizleyin.

    Bu, 2D perspektifi zorlar ve açılı 3D görünümden kaynaklanabilecek olası hataları ortadan kaldırır.

  4. Haritada konumu sağ tıklayın ve uzunluk/enlem seçeneğini belirleyerek panonuza kopyalayın.

Google Earth'ü kullanma

Kullanıcı arayüzünde bir konumu tıklayıp yer işareti ayrıntılarındaki verileri okuyarak Google Earth'te bir konumun enlem ve boylamını hesaplayabilirsiniz.

Google Earth'ü kullanarak bir yerin enlem ve boylamını öğrenmek için:

  1. Masaüstü bilgisayarınızda Google Earth'e gidin.

  2. Hamburger menüsüne gidip Harita Stili'ni seçin.

  3. 3D Binalar anahtarını kapalı konuma getirin.

  4. 3D Binalar anahtarı kapatıldıktan sonra, seçilen konuma bir yer işareti eklemek için raptiye simgesini tıklayın.

  5. Yer işaretinizi içerecek bir proje belirtin ve Kaydet'i tıklayın.

  6. Yer işaretinin Başlık alanına yer işareti için bir ad girin.

  7. Proje bölmesinde geri oku tıklayın ve Diğer İşlemler menüsünü seçin.

  8. Menüden KML dosyası olarak dışa aktar'ı seçin.

KLM dosyası, aşağıda belirtildiği gibi, <coordinates> etiketindeki bir yer işaretinin enlem, boylam ve rakımını virgülle ayrılmış olarak bildirir:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

<LookAt> etiketlerindeki enlem ve boylamı kullanmayın. Bu değerler, konumu değil kameranın konumunu belirtir.

Fiziksel konuma gitme

Bir konumun rakımını, o konuma fiziksel olarak gidip yerel gözlem yaparak hesaplayabilirsiniz.

Rotasyon dördünü alma

GARGeospatialTransform.eastUpSouthQTarget, Coğrafi Dönüşümden yönü ayıklar ve bir vektörü hedeften doğu-güne (EUS) koordinat sistemine dönüştüren döndürme matrisini temsil eden bir kuaterniyon üretir. X+ doğu yönü, Y+ yukarı ve Z+ noktası güneydir. Değerler {x, y, z, w} sırasına göre yazılır.

WGS84 çapaları

WGS84 Sabitleyici, 3D içeriği belirli bir enlem, boylam ve rakıma yerleştirmenize olanak tanıyan bir sabit türüdür. Gerçek dünyaya yerleştirilmesi için bir Dönüşüm ve yöne ihtiyaç duyar. Konum; WGS84 koordinat sisteminde belirtilen bir enlem, boylam ve yükseklikten oluşur. Yönlendirme, dört boyutlu dönme operatöründen oluşur.

Rakım, referans WGS84 elipsoitinin üzerindeki metre cinsinden, zemin seviyesi sıfırda olmayacak şekilde bildirilir. Oluşturulan her ankraj için bu koordinatları sağlamak uygulamanızın sorumluluğundadır.

Gerçek dünyaya WGS84 ankrajı yerleştirme

Bir yerin rakımını belirleme

Sabitleri yerleştirmek için bir konumun rakımını belirlemenin birkaç yolu vardır:

  • Sabit noktanın konumu fiziksel olarak kullanıcıya yakınsa kullanıcının cihazının rakımına benzer bir rakım kullanabilirsiniz.
  • Enlem ve boylam değerlerini aldıktan sonra EGM96 spesifikasyonuna göre yükseklik bilgisi almak için Elevation API'yi kullanın. GARGeospatialTransform rakımıyla karşılaştırmak için Maps API EGM96 rakımını WGS84'e dönüştürmeniz gerekir. Hem komut satırı hem de HTML arayüzü içeren GeoidEval'ı inceleyin. Maps API, enlem ve boylam değerlerini WGS84 spesifikasyonuna göre raporlar.
  • Bir konumun enlem, boylam ve rakımını Google Earth'ten edinebilirsiniz. Bu işlem, birkaç metreye kadar hata payı verir. KML dosyasında <LookAt> etiketlerindeki değil, <coordinates> etiketlerindeki enlem, boylam ve rakımı kullanın.
  • Yakınınızda mevcut bir ankraj varsa ve dik bir eğimde değilseniz Haritalar API'si gibi başka bir kaynak kullanmadan kameranın GARGeospatialTransform yüksekliğini kullanabilirsiniz.

Anchor'ı oluşturma

Enlem, boylam, rakım ve dönme dört boyutlu vektörüne sahip olduktan sonra içeriği belirttiğiniz coğrafi koordinatlara sabitlemek için createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: öğesini kullanın.

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];
.

Arazi Sabitleri

Arazi ankrajı, yerden tam yüksekliği bulmak için VPS'den alınan bilgilerden yararlanarak yalnızca enlem ve boylam kullanarak AR nesneleri yerleştirmenize olanak tanıyan bir ankraj türüdür.

İstediğiniz yüksekliği girmek yerine, arazi üzerindeki yüksekliği belirtirsiniz. Bu değer sıfır olduğunda ankraj, araziyle aynı hizada olur.

Uçak bulma modunu ayarlama

Düzlem bulma isteğe bağlıdır ve çapaları kullanmak için gerekli değildir. Yalnızca yatay düzlemlerin kullanıldığını unutmayın. Yatay düzlemler, zemindeki arazi çapalarının dinamik hizalamasına yardımcı olur.

Uygulamanızın uçakları nasıl algılayacağını seçmek için ARWorldTrackingConfiguration.PlaneDetection simgesini kullanın.

Yeni Eşzamansız API'yi kullanarak Arazi bağlantısı oluşturma

Arazi sabiti oluşturmak ve yerleştirmek için GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error: numaralı telefonu arayın.

Sabitleme hemen hazır olmaz ve çözülmesi gerekir. Sorun çözüldükten sonra GARCreateAnchorOnTerrainFuture'nda kullanılabilir.

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Geleceğin Durumu'nu kontrol edin

Gelecekte, ilişkilendirilmiş bir GARFutureState olacaktır.

Eyalet Açıklama
GARFutureStatePending Bu işlem hâlâ beklemede.
GARFutureStateDone İşlem tamamlandı ve sonuç kullanılabilir.
GARFutureStateCancelled İşlem iptal edildi.

Gelecek sonucunun arazi ankrajı durumunu kontrol edin

GARTerrainAnchorState, asenkron işleme aittir ve nihai Future sonucunun bir parçasıdır.

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Çatı Sabitleyicileri

Çatı dübelleri Lokomotifi

Çatı çapaları bir tür çapa türüdür ve yukarıdaki Arazi çapalarına çok benzer. Aradaki fark, arazi üzerindeki rakım yerine çatı üzerindeki rakımı sağlamanızdır.

Yeni Async API'yi kullanarak çatı bağlantısı oluşturma

Sabitleme hemen hazır olmaz ve çözülmesi gerekir.

Çatı çapası oluşturup yerleştirmek için GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error: numaralı telefonu arayın. Arazi çapalarına benzer şekilde, Geleceğin GARFutureState sitesine de erişebileceksiniz. Ardından, GARRooftopAnchorState'a erişmek için Gelecek sonucunu kontrol edebilirsiniz.

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

Geleceğin Durumu'nu kontrol edin

Gelecek'in ilişkili bir GARFutureState değeri vardır. Yukarıdaki tabloya bakın.

Gelecek sonucunun çatı ankrajı durumunu kontrol edin

GARRooftopAnchorState, asenkron işleme aittir ve nihai Future sonucunun bir parçasıdır.

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Sırada ne var?