Gerçek dünyadaki içerikleri Android SDK'sında (Kotlin/Java) 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 ankraj türleri

Her biri rakımı farklı şekilde ele alan üç tür coğrafi ankraj 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 sabitleyicileri:
    Arazi sabitleyicileri, yalnızca enlem ve boylam kullanarak içerik yerleştirmenize olanak tanır. Bu içerikler, ilgili konumdaki araziye göre yükseklik bilgisine sahiptir. 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 içeren içerik yerleştirmenize olanak tanır. Rakım, Sokak Görünümü Geometrisi ile bilinen bir binanın tepesine göre belirlenir. Bu seçenek, bir binaya yerleştirilmediğinde varsayılan olarak arazi rakımını kullanır.

WGS84 Arazi Çatı
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 tarafından çözülmesi gerekiyor mu? 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.

İsabet testi kullanarak ana hat oluşturma

İsabet testi sonucundan da coğrafi yer işareti oluşturabilirsiniz. İsabet testinden elde edilen pozu kullanın ve GeospatialPose olarak dönüştürün. Açıklanan 3 ankraj türünden herhangi birini yerleştirmek için kullanın.

AR pozundan coğrafi konumlu poz alma

Earth.getGeospatialPose(), bir AR pozunu coğrafi poza dönüştürerek enlem ve boylamı belirlemenin ek bir yolunu sunar.

Coğrafi konumlu bir duruştan AR duruşu alma

Earth.getPose(), Dünya tarafından belirtilen yatay konumu, irtifayı ve dört boyutlu dönme vektörünü doğu-yukarı-güney koordinat çerçevesine göre GL dünya koordinatına göre bir AR pozuna 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ı üç şekilde hesaplayabilirsiniz:

  • 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. Böylece Unity Editor'da Google haritalarını kullanarak üç boyutlu içerikleri görsel olarak 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'i kullanarak elde etmenin birkaç metreye varan bir hata payı olduğunu unutmayın.
  • Fiziksel konuma gitme

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 konumun enlem ve boylamını öğrenmek 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ı kapatın.

  4. 3D Binalar anahtarı kapatıldıktan sonra, seçilen konuma 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ı için fiziksel olarak oraya gidip yerel gözlem yapabilirsiniz.

Döndürme dört boyutlu vektörünü alma

GeospatialPose.getEastUpSouthQuaternion(), coğrafi konumlu bir duruştan yönelimi çıkarır ve bir vektörü hedeften doğu-yukarı-güney (DYG) koordinat sistemine dönüştüren dönme matrisini temsil eden bir dört boyutlu vektör çıkarır. X+ doğuya, Y+ yukarıya ve Z+ güneye işaret eder. Değerler {x, y, z, w} sırasına göre yazılır.

WGS84 çapaları

WGS84 ankrajı, 3D içerikleri belirli bir enlem, boylam ve yüksekliğe yerleştirmenize olanak tanıyan bir ankraj türüdür. Gerçek dünyaya yerleştirilmek için bir duruş 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 elipsoidinin metre cinsinden üstünde raporlanır. Bu durumda, zemin seviyesi sıfır değildir. Oluşturulan her çapa için bu koordinatların sağlanmasından uygulamanız sorumludur.

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

Bir yerin rakımını belirleme

Yer işareti yerleştirmek için bir konumun yüksekliğini 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. GeospatialPose 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üne sahip GeoidEval'e bakın. Maps API, enlem ve boylamı varsayılan olarak WGS84 spesifikasyonuna göre raporlar.
  • Bir konumun enlem, boylam ve rakımını Google Earth'ten öğrenebilirsiniz. Bu işlem, birkaç metrelik bir hata payı sağlar. KML dosyasında <LookAt> etiketlerini değil <coordinates> etiketlerindeki enlem, boylam ve yüksekliği kullanın.
  • Yakınınızda mevcut bir ankraj varsa ve dik bir yokuşta değilseniz Haritalar API'si gibi başka bir kaynak kullanmadan kameranın GeospatialPose yüksekliğini kullanabilirsiniz.

Anchor'ı oluşturma

Enlem, boylam, rakım ve dönme dörtlüsünü belirledikten sonra içeriği belirttiğiniz coğrafi koordinatlara bağlamak için Earth.createAnchor() öğesini kullanın.

Java

if (earth != null && earth.getTrackingState() == TrackingState.TRACKING) {
  Anchor anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw);

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

Kotlin

if (earth.trackingState == TrackingState.TRACKING) {
  val anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw
    )

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

Arazi sabitleme noktaları

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.

İstenen rakımı girmek yerine, arazinin üzerindeki rakımı girersiniz. Bu değer sıfır olduğunda ankraj, araziyle aynı hizada olur.

Uçak bulma modunu ayarlama

Uçak bulma özelliği isteğe bağlıdır ve sabit noktaları kullanmak için gerekli değildir. Yalnızca yatay düzlemlerin kullanıldığını unutmayın. Yatay düzlemler, arazi ankrajlarının zeminde dinamik olarak hizalanmasına yardımcı olur.

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

Yeni Async API'yi kullanarak arazi yer işareti oluşturma

Arazi ankrajı oluşturmak ve yerleştirmek için Earth.resolveAnchorOnTerrainAsync() tuşuna basın.

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

Java

final ResolveAnchorOnTerrainFuture future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    /* altitudeAboveTerrain= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

Kotlin

var future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    altitudeAboveTerrain,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

Geleceğin Durumu'nu kontrol edin

Gelecek'in ilişkili bir FutureState değeri vardır.

Eyalet Açıklama
FutureState.PENDING Bu işlem hâlâ beklemede.
FutureState.DONE İşlem tamamlandı ve sonuç kullanılabilir.
FutureState.CANCELLED İşlem iptal edildi.

Gelecek sonucunun arazi ankrajı durumunu kontrol edin

Anchor.TerrainAnchorState, eşzamansız işleme aittir ve Future'daki nihai sonucun bir parçasıdır.

Java

switch (terrainAnchorState) {
  case SUCCESS:
    // A resolving task for this Terrain anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

Kotlin

when (state) {
  TerrainAnchorState.SUCCESS -> {
    // A resolving task for this Terrain anchor has finished successfully.
  }
  TerrainAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  TerrainAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  TerrainAnchorState.ERROR_INTERNAL -> {
    // The Terrain anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

Çatı Sabitleyicileri

Çatı sabitleme aparatları hero

Çatı sabitleri, bir tür sabit'tir ve yukarıdaki arazi sabitlerine ç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ı ankrajı oluşturmak ve yerleştirmek için Earth.resolveAnchorOnRooftopAsync() numaralı telefonu arayın. Arazi çapalarına benzer şekilde, Geleceğin FutureState özelliğine de erişebileceksiniz. Ardından, Anchor.RooftopAnchorState'a erişmek için Gelecek sonucunu kontrol edebilirsiniz.

Java

final ResolveAnchorOnRooftopFuture future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    /* altitudeAboveRooftop= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

Kotlin

var future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    altitudeAboveRooftop,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

Geleceğin Durumu'nu kontrol edin

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

Gelecek sonucunun çatı ankrajı durumunu kontrol edin

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

Java

switch (rooftopAnchorState) {
  case SUCCESS:
    // A resolving task for this Rooftop anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API.
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

Kotlin

when (state) {
  RooftopAnchorState.SUCCESS -> {
    // A resolving task for this Rooftop anchor has finished successfully.
  }
  RooftopAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  RooftopAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  RooftopAnchorState.ERROR_INTERNAL -> {
    // The Rooftop anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

Sırada ne var?