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

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

Coğrafi mekansal çapa türleri

Her biri rakımı farklı şekilde işleyen üç tür Coğrafi sabitleyici vardır:

  1. WGS84 bağlantıları:
    WGS84 bağlantıları, 3D içeriği herhangi bir enlem, boylam ve rakıma yerleştirmenize olanak tanır.

  2. Arazi çapaları:
    Arazi çapaları, içeriği yalnızca enlem ve boylam kullanarak yerleştirebilmenize olanak tanır. Rakım, VPS tarafından bilinen zemine veya zemine göre belirlenir.

  3. Çapta sabit reklamlar:
    Çapta sabitlemeleri, yalnızca enlem ve boylam kullanarak içerik yerleştirmenize olanak tanır. Bu sabitlemeler, ilgili konumdaki bir binanın çatısına göre yükseklikle belirlenir. Rakım, Sokak Görünümü Geometrisi ile bilinen binanın tepesine göre belirlenir. Bu ayar, bir binaya yerleştirilmediğinde varsayılan olarak arazi rakımını ayarlar.

WGS84 Arazi Çatı
Yatay Konum Enlem, Boylam Enlem, Boylam Enlem, Boylam
Dikey Konum WGS84 rakımına göre Google Haritalar tarafından belirlenen arazi düzeyine göre Google Haritalar tarafından belirlenen çatı seviyesine göre
Sunucu tarafından çözümlenmesi gerekiyor mu? Hayır Evet Evet

Ön koşullar

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

Coğrafi çapalar yerleştirin

Her çapa türünün bunları oluşturmak için özel API'ları vardır. Daha fazla bilgi için Coğrafi mekansal sabitlerin türleri konusuna bakın.

Hit-test ile çapa oluşturma

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

AR Dönüşümünden Coğrafi Dönüşüm Elde Etme

GARSession.geospatialTransformFromTransform:error:, AR Dönüşümünü Coğrafi Dönüşüme dönüştürerek enlem ve boylamı belirlemek için ek bir yöntem sunar.

Coğrafi Dönüşümden Artırılmış Gerçeklik (AR) Dönüşümü Alma

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error:, doğudan güneye koordinat çerçevesine göre Earth'te belirtilen yatay konumu, yüksekliği ve dörtgen dönüşü GL dünya koordinatına göre bir AR Dönüşümüne dönüştürür.

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

Anchor oluşturma yöntemlerinin her biriyle ilişkili bazı ödünler vardır:

  • Streetscape Geometri'yi kullanırken bir binaya içerik eklemek için hit test aracını kullanın.
  • Google Haritalar tarafından belirlenen rakım değerlerini kullandıkları için WGS84 çapaları yerine Arazi veya Çatı çapalarını tercih eder.

Bir konumun enlem ve boylamını belirleme

Bir yerin enlem ve boylamını üç şekilde hesaplayabilirsiniz:

  • Fiziksel olarak bir konuma gitmek zorunda kalmadan dünyayı 3D içerikle görüntülemek ve zenginleştirmek için Geospatial Creator'ı kullanın. Bu, Unity Düzenleyici'de Google Haritalar'ı kullanarak üç boyutlu üç boyutlu içeriği görsel olarak yerleştirmenizi sağlar. İçeriğin enlem, boylam, dönüş ve rakım değerleri sizin için otomatik olarak hesaplanır.
  • Google Haritalar'ı kullan
  • Google Earth'ü kullanın. Bu koordinatları Google Haritalar’ın aksine Google Earth kullanılarak almanın, birkaç metre hata payı olacağını unutmayın.
  • Fiziksel konuma gidin

Google Haritalar'ı kullan

Google Haritalar'ı kullanarak bir konumun enlem ve boylamını almak 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 kutusunun işaretini kaldırın.

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

  4. Haritada konumu sağ tıklayın ve boylamı/enlem değerini seçerek panonuza kopyalayın.

Google Earth'ü kullanma

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

Google Earth'ü kullanarak bir konumun enlem ve boylamını almak için:

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

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

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

  4. 3D Binalar anahtarı kapatıldıktan sonra iğne simgesini tıklayarak seçilen konuma bir yer işareti ekleyin.

  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 okunu 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ı, <coordinates> etiketindeki bir yer işaretinin enlem, boylam ve rakımını virgülle ayırarak raporlar:

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

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

Fiziksel konuma gidin

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

Rotasyon dörtlüsünü alma

GARGeospatialTransform.eastUpSouthQTarget, bir Coğrafi Dönüşümden yönü ayıklar ve bir vektörü hedeften doğudan güneye (EUS) koordinat sistemine dönüştüren dönme matrisini temsil eden bir dörtlü biçim üretir. X+ doğu, Y+ yukarı ve Z+ güney puan alır. Değerler {x, y, z, w} sırasına göre yazılır.

WGS84 Sabitleyiciler

WGS84 Sabitlemesi, 3D içeriği herhangi bir enlem, boylam ve rakıma yerleştirmenize olanak tanıyan bir sabitleme türüdür. Gerçek dünyaya yerleştirmek için dönüşüme ve yöne ihtiyaç duyar. Konum, WGS84 koordinat sisteminde belirtilen bir enlem, boylam ve rakımdan oluşur. Yön dörtlü döndürmeden oluşur.

Rakım, referans WGS84 elipsoitin metre cinsinden üzerinde, zemin seviyesinin sıfır olmayacağı şekilde bildirilir. Oluşturulan her sabit reklam için bu koordinatları sağlamak uygulamanız sorumludur.

Gerçek dünyaya bir WGS84 çapası yerleştirin

Bir konumun rakımını belirleme

Bir konumun çapa yerleştirmek için yüksekliğini belirlemenin birkaç yolu vardır:

  • Çapa 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ı öğrendikten sonra, EGM96 spesifikasyonuna uygun bir yükseklik almak için Elevation API'yi kullanın. GARGeospatialTransform rakımıyla karşılaştırma yapmak için Maps API EGM96 yüksekliğini WGS84'e dönüştürmeniz gerekir. Hem komut satırı hem de HTML arayüzü bulunan GeoidEval'a bakın. Google Haritalar API'sı, enlem ve boylamı standart WGS84 spesifikasyonuna uygun olarak bildirir.
  • Bir konumun enlem, boylam ve rakım bilgilerini Google Earth'ten alabilirsiniz. Bu birkaç metrelik hata payı verir. KML dosyasında <LookAt> etiketlerindeki değil, <coordinates> etiketlerindeki enlem, boylam ve rakım değerlerini kullanın.
  • Yakında mevcut bir çapa varsa ve dik bir yokuşta değilseniz kameranın GARGeospatialTransform rakımını Maps API gibi başka bir kaynak kullanmadan kullanabilirsiniz.

Anchor oluşturma

Enlem, boylam, rakım ve döndürme dörtlüsünü belirledikten sonra içeriği, belirttiğiniz coğrafi koordinatlara sabitlemek için createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: kullanın.

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

Arazi Sabitlemeleri

Arazi sabitlemesi, AR nesnelerini yalnızca enlem ve boylam kullanarak yerleştirmenize olanak tanıyan bir sabitleme türüdür. Yer üzerindeki kesin rakımı bulmak için VPS'den alınan bilgilerden yararlanabilirsiniz.

İstenen rakımı girmek yerine, arazinin üzerindeki rakımı sağlarsınız. Bu sıfır olduğunda çapa arazi ile aynı seviyede olur.

Uçak bulma modunu ayarla

Uçak bulma isteğe bağlıdır ve çapa 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 Async API'yi kullanarak Arazi bağlantısı oluşturun.

Arazi bağlayıcısı oluşturmak ve yerleştirmek için GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error: yöntemini çağırın.

Çapa hemen hazır olmaz ve çözümlenmesi gerekir. Sorun çözüldükten sonra GARCreateAnchorOnTerrainFuture'da kullanılabilir olacak.

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

Geleceğin Durumunu Kontrol Edin

Gelecekte ilişkilendirilmiş bir GARFutureState olacaktır.

Eyalet Açıklama
GARFutureStatePending Bu işlem hâlâ beklemede.
GARFutureStateDone İşlem tamamlandı ve sonucu hazır.
GARFutureStateCancelled İşlem iptal edildi.

Gelecekteki sonucun Arazi çapa durumunu kontrol etme

GARTerrainAnchorState eşzamansız işleme aittir ve Gelecekteki nihai sonucun 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ı Dübelleri

Çatı çapaları Lokomotif Resim

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

Yeni Async API'yi kullanarak bir Rooftop bağlantısı oluşturma

Çapa hemen hazır olmaz ve çözümlenmesi gerekir.

Rooftop bağlayıcısı oluşturmak ve yerleştirmek için GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error: numaralı telefonu arayın. Arazi çapalarına benzer şekilde, Geleceğin GARFutureState bölümüne de erişeceksiniz. Ardından, GARRooftopAnchorState erişimi için Gelecekteki sonucu kontrol edebilirsiniz.

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

Geleceğin Durumunu Kontrol Edin

Gelecekte ilişkili bir GARFutureState olacaktır. Yukarıdaki tabloya bakın.

Gelecekteki sonucun Rooftop çapa durumunu kontrol edin

GARRooftopAnchorState eşzamansız işleme aittir ve Gelecekteki nihai sonucun 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?