Android NDK için Genişletilmiş Görseller Geliştirici Kılavuzu

Artırılmış resimleri kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.

Ön koşullar

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

Görüntü veritabanı oluşturma

Referans resimleri depolamak için bir ArAugmentedImageDatabase oluşturun. İki yol vardır:

  • Boş veritabanı oluşturma
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
std::string database_buffer;
util::LoadFileFromAssetManager(asset_manager_, "sample_database.imgdb",
                               &database_buffer);
uint8_t* raw_buffer = reinterpret_cast<uint8_t*>(&database_buffer.front());

ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
const ArStatus status = ArAugmentedImageDatabase_deserialize(
    ar_session, raw_buffer, database_buffer.size(),
    &ar_augmented_image_database);

Veritabanı dosyaları, Resim Aracı ile veya ArAugmentedImageDatabase_serialize() çağrısı yapılarak oluşturulabilir.

Veritabanına resim ekleyin

İstediğiniz referans görüntüler veritabanı dosyasından zaten yüklenmişse bu adım isteğe bağlıdır. Çalışma zamanında resim eklemek için aşağıda gösterildiği gibi ArAugmentedImageDatabase_addImage() komutunu çağırın. util ad alanındaki işlevler için augmented_image_c örnek uygulamasına bakın.

int32_t width, height, stride, index;
uint8_t* image_pixel_buffer = nullptr;
constexpr const char kSampleImageName[] = "default.jpg";
bool load_image_result = util::LoadImageFromAssetManager(
    kSampleImageName, &width, &height, &stride, &image_pixel_buffer);

uint8_t* grayscale_buffer = nullptr;
util::ConvertRgbaToGrayscale(image_pixel_buffer, width, height, stride,
                             &grayscale_buffer);

int32_t grayscale_stride = stride / 4;
const ArStatus status = ArAugmentedImageDatabase_addImage(
    ar_session_, ar_augmented_image_database, kSampleImageName,
    grayscale_buffer, width, height, grayscale_stride, &index);

// If the physical size of the image is known, you can instead use
//     ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize
// This will improve the initial detection speed. ARCore will still actively
// estimate the physical size of the image as it is viewed from multiple
// viewpoints.

delete[] image_pixel_buffer;
delete[] grayscale_buffer;

index ve name değerleri daha sonra hangi referans resmin algılandığını tanımlamak için kullanılır.

Resim izlemeyi etkinleştir

Görüntü veritabanını kaydederek ARCore oturumunuzu görüntüleri izleyecek şekilde yapılandırın:

ArConfig_setAugmentedImageDatabase(ar_session_, ar_config,
                                   ar_augmented_image_database);
const ArStatus status = ArSession_configure(ar_session_, ar_config);

Oturum sırasında ARCore, kamera görüntüsündeki özellik noktalarını kullanarak görüntü veritabanındaki noktaları kullanır.

AR oturumunda artırılmış görüntü bulma

Eşleşen resimleri görmek için kare güncelleme döngünüzdeki güncellenmiş ArAugmentedImageları arayın.

// Update loop, in onDrawFrame
ArTrackableList* updated_image_list = nullptr;
ArTrackableList_create(ar_session_, &updated_image_list);
ArFrame_getUpdatedTrackables(
    ar_session_, ar_frame_, AR_TRACKABLE_AUGMENTED_IMAGE, updated_image_list);

int32_t image_list_size;
ArTrackableList_getSize(ar_session_, updated_image_list, &image_list_size);

for (int i = 0; i < image_list_size; ++i) {
  ArTrackable* ar_trackable = nullptr;
  ArTrackableList_acquireItem(ar_session_, updated_image_list, i,
                              &ar_trackable);
  ArAugmentedImage* image = ArAsAugmentedImage(ar_trackable);

  ArTrackingState tracking_state;
  ArTrackable_getTrackingState(ar_session_, ar_trackable, &tracking_state);

  int image_index;
  ArAugmentedImage_getIndex(ar_session_, image, &image_index);

  if (tracking_state == AR_TRACKING_STATE_TRACKING) {
    util::ScopedArPose scopedArPose(ar_session_);
    ArAugmentedImage_getCenterPose(ar_session_, image,
                                   scopedArPose.GetArPose());

    ArAnchor* image_anchor = nullptr;
    const ArStatus status = ArTrackable_acquireNewAnchor(
        ar_session_, ar_trackable, scopedArPose.GetArPose(), &image_anchor);

    // For example, you can now render content at the image anchor, choosing
    // content based on the image index (or name).
  }
}

Farklı kullanım alanlarını destekleme

ARCore, Artırılmış Resim algıladığında bunun için bir Trackable oluşturur Genişletilmiş Resim ve ArTrackingState kümeleri TRACKING adlı yerine ArAugmentedImageTrackingMethod. - FULL_TRACKING. İzlenen resim kamera görünümünün dışına çıktığında ARCore, ArTrackingState - TRACKING, ancak ArAugmentedImageTrackingMethod değiştiriliyor yönünü ve konumunu sağlamaya devam ederken LAST_KNOWN_POSE resim.

Kullanım amacına bağlı olarak uygulamanızda izleme durumu ve izleme yöntemi farklı şekilde kullanılmalıdır dava açın.

  • Sabit resimler. Yerlerine sabitlenmiş resimler içeren çoğu kullanım alanı (taşınması beklenmeyen) basitçe ArTrackingState kullanarak resmin algılanıp algılanmadığı ve konumunun bilinip bilinmediği. ArAugmentedImageTrackingMethod yoksayılabilir.

  • Hareketli resimler. Uygulamanızın hareketli bir resmi izlemesi gerekiyorsa her ikisini de kullanın Resmin yüksek olup olmadığını belirlemek için ArTrackingState ve ArAugmentedImageTrackingMethod ve konumunun bilinip bilinmediği.

Kullanım alanı Düzeltilen resim Resim taşınıyor
Örnek Duvara asılı poster Otobüsün yanındaki reklam
Poz şöyle olabilir:
şu durumda geçerli kabul edilir:
ArTrackingState == TRACKING ArTrackingState == TRACKING.
ArAugmentedImageTrackingMethod == FULL_TRACKING