Gerçek dünyadaki içerikleri Android SDK'sında (Kotlin/Java) konumlandırmak için coğrafi bağlantıları kullanma

Coğrafi sabitler, 3D içeriği gerçek dünyaya yerleştirmenize olanak tanıyan bir sabit 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 çapaları:
    WGS84 çapaları, herhangi bir enleme 3D içerik yerleştirmenize olanak tanır. boylam ve rakım gibi değerleri içerir.

  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. Rakım, bilinen adıyla zemine veya kata göre belirlenir VPS tarafından.

  3. Çatı çapaları:
    Çatı montajı sadece enlem ve göbek kullanarak içerik yerleştirmenize olanak sağlar bir binanın söz konusu konumdaki çatısına göre yüksekliği olan boylam. Rakım, binanın bilinen tepesine göre belirlenir Streetscape Geometri'ye göre belirlenir. Bu seçenek, bir binaya yerleştirilmediğinde varsayılan olarak arazi rakımını kullanır.

WGS84 Arazi Araç Tavanı
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 çözümlemesi mi gerekiyor? Hayır Evet Evet

Ön koşullar

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

Coğrafi çapalar yerleştirme

Her sabit türün oluşturulması için özel API'ler bulunur. Daha fazla bilgi için Coğrafi sabitler türleri konusuna bakın.

Hit-test'ten bir çapa oluşturma

Bir isabet testi sonucundan Coğrafi konum sabiti de oluşturabilirsiniz. Hit-test'teki Pose'i kullanın ve GeospatialPose'ye dönüştürün. Açıklanan 3 sabitleyici türünden herhangi birini yerleştirmek için bunu kullanın.

Artırılmış Gerçeklik (AR) Pozundan Coğrafi Poz Alma

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

Coğrafi Konumdan Artırılmış Gerçeklik Pozu Alma

Earth.getPose(), doğudan-güneye 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 Konumuna dönüştürür.

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

Çapa oluşturmayla ilgili her yöntemin bazı avantajları vardır:

  • Sokak Görünümü Geometrisi'ni kullanırken bir binaya içerik eklemek için "isabet test" yöntemini 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 enlem, boylam, dönüş ve rakımı 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'a gidin > Diğer.

  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 işlem 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 panonuza kopyalamak için boylam/enlem değerlerini seçin.

Google Earth'ü kullanma

Kullanıcı arayüzünde 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ı öğ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ı 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ölmesindeki 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ı, 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 değerlerini kullanmayın. Bu değerler, konumu değil kamera konumunu belirtir.

Fiziksel konuma gidin

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

Rotasyon dördünü alma

GeospatialPose.getEastUpSouthQuaternion(), Coğrafi Konumdan 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 oluşturur. 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 duruş ve yönlendirmeye dayanır. Konum, WGS84 koordinat sisteminde belirtilen bir enlem, boylam ve rakımdan oluşur. Yön, dörtlü rotasyonundan oluşur.

Rakım, referans WGS84 elipsoitinin üzerindeki metre cinsinden, zemin seviyesi sıfırda olmayacak şekilde bildirilir. Oluşturulan her çapa için bu koordinatların sağlanmasından uygulamanız sorumludur.

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

Bir yerin rakımını belirleme

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

  • Sabit reklamın konumu fiziksel olarak kullanıcının yakınındaysa kullanıcının cihazının rakımına benzer bir rakım kullanabilirsiniz.
  • Enlem ve boylamı belirledikten sonra, EGM96 spesifikasyonuna uygun bir yükseklik almak için Elevation API'yi kullanın. GeospatialPose 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ü 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ç metrelik bir hata payı sağlar. KML dosyasında <LookAt> etiketlerindeki değil, <coordinates> etiketlerindeki enlem, boylam ve rakımı kullanın.
  • Mevcut bir çapa yakındaysa ve dik bir eğimde değilseniz kameranın GeospatialPose rakımını Maps API gibi başka bir kaynak kullanmadan kullanabilirsiniz.

Bağlayıcı oluşturma

Enlem, boylam, rakım ve dönme dördünü belirledikten sonra Earth.createAnchor() özelliğini kullanın özelliğini de kullanabilirsiniz.

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 Sabitleri

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

İstenen rakımı girmek yerine, arazinin üzerindeki rakımı girin. Bu değer sıfır olduğunda çapa, arazi ile aynı hizaya gelir.

Uçak bulma modunu ayarlama

Düzlem bulma isteğe bağlıdır ve sabitleri 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 Config.PlaneFindingMode 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 Earth.resolveAnchorOnTerrainAsync() numaralı telefonu arayın.

Sabit 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 Durumunu Kontrol Edin

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

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

Gelecekteki sonucun Arazi bağlantı 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ı Dübelleri

Çatı dübelleri Lokomotifi

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

Yeni Async API'yi kullanarak Çatı çapası oluşturma

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

Çatı çapası oluşturup yerleştirmek için Earth.resolveAnchorOnRooftopAsync() numaralı telefonu arayın. Arazi çapalarına benzer şekilde, Geleceğin FutureState sitesine de erişebileceksiniz. Ardından, Anchor.RooftopAnchorState aracına erişmek için Gelecekteki sonucu 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 Durumunu Kontrol Edin

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

Gelecekteki sonucun Çatı çapa durumunu kontrol edin

Anchor.RooftopAnchorState, eşzamansız işleme aittir ve Future'daki nihai sonucun 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?