Android NDK'da gerçek dünyadaki içeriği 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 Pose'ı kullanarak ArGeospatialPose simgesine dönüştürün. Açıklanan 3 çapa türünden herhangi birini yerleştirmek için bunu kullanın.

Artırılmış Gerçeklik (AR) Pozundan Coğrafi Konum Verin

ArEarth_getGeospatialPose(), AR Pozunu Coğrafi Konuma dönüştürerek enlem ve boylamı belirlemek için ek bir yöntem sunar.

Coğrafi Konumdan Artırılmış Gerçeklik (AR) Pozisyonu Alın

ArEarth_getPose(), 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 Konumuna 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

ArGeospatialPose_getEastUpSouthQuaternion(), bir Coğrafi Konumdan 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 bir pozisyona ve yöne bağlıdır. 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. ArGeospatialPose 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 ArGeospatialPose 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 ArEarth_acquireNewAnchor() kullanın.

float eus_quaternion_4[4] = {qx, qy, qz, qw};
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArAnchor* earth_anchor = NULL;
    ArStatus status = ArEarth_acquireNewAnchor(ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude,
        eus_quaternion_4, &earth_anchor);

    // Attach content to the anchor specified by geodetic location and
    // pose.
  }
}

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 ArPlaneFindingMode 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 ArEarth_resolveAnchorOnTerrainAsync() yöntemini çağırın.

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

ArResolveAnchorOnTerrainFuture_getResultTerrainAnchorState() kullanarak arazinin çapa durumunu kontrol edin. ArResolveAnchorOnTerrainFuture_acquireResultAnchor() kullanarak çözümlenen sabiti alma.

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnTerrainCallback callback = NULL;
ArResolveAnchorOnTerrainFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnTerrainAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_terrain, eus_quaternion_4,
        context, callback, &future);
  }
}

Geleceğin Durumunu Kontrol Edin

Gelecekte ilişkilendirilmiş bir ArFutureState olacaktır.

Eyalet Açıklama
AR_FUTURE_STATE_PENDING Bu işlem hâlâ beklemede.
AR_FUTURE_STATE_DONE İşlem tamamlandı ve sonucu hazır.
AR_FUTURE_STATE_CANCELLED İşlem iptal edildi.

Gelecekteki sonucun Arazi çapa durumunu kontrol etme

ArTerrainAnchorState eşzamansız işleme aittir ve Gelecekteki nihai sonucun bir parçasıdır.

switch (terrain_anchor_state) {
  case AR_TERRAIN_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_INTERNAL:
    // 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 ArEarth_resolveAnchorOnRooftopAsync() numaralı telefonu arayın. Arazi çapalarına benzer şekilde, Geleceğin ArFutureState bölümüne de erişeceksiniz. Ardından, ArRooftopAnchorState erişimi için Gelecekteki sonucu kontrol edebilirsiniz.

ArResolveAnchorOnRooftopFuture oluşturmak için ArEarth_resolveAnchorOnRooftopAsync() kodunu kullanın.

Çatı sabitleme durumunu kontrol etmek için ArResolveAnchorOnRooftopFuture_getResultRooftopAnchorState() aracını kullanın.

ArResolveAnchorOnRooftopFuture_acquireResultAnchor() kullanarak çözümlenen sabiti alma.

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnRooftopCallback callback = NULL;
ArResolveAnchorOnRooftopFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnRooftopAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_rooftop, eus_quaternion_4,
        context, callback, &future);
  }
}

Geleceğin Durumunu Kontrol Edin

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

Gelecekteki sonucun Rooftop çapa durumunu kontrol edin

ArRooftopAnchorState eşzamansız işleme aittir ve Gelecekteki nihai sonucun bir parçasıdır.

switch (rooftop_anchor_state) {
  case AR_ROOFTOP_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

Sırada ne var?