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

Artırılmış Görüntüleri kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.

Ön koşullar

Devam etmeden önce temel AR kavramlarını ve ARCore oturumunu nasıl yapılandıracağınızı anladığınızdan emin olun.

Resim veritabanı oluşturma

Referans görüntülerini depolamak için bir ArAugmentedImageDatabase oluşturun. Bunu iki şekilde yapabilirsiniz:

  • 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 ekleme

İstediğiniz referans resimler veritabanı dosyasından zaten yüklendiyse bu adım isteğe bağlıdır. Çalışma zamanında resim eklemek için aşağıdaki gibi ArAugmentedImageDatabase_addImage() işlevini ç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ı belirlemek için kullanılır.

Resim izlemeyi etkinleştirme

ARCore oturumunuzu, resim veritabanını kaydederek resimleri 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);

ARCore, oturum sırasında kamera görüntüsünden alınan özellik noktalarını kullanarak görüntü veritabanındakilerle eşleştirme yapar.

AR oturumunda artırılmış resimleri bulma

Eşleşen resimleri almak için çerçeve güncelleme döngüsünüzde güncellenmiş ArAugmentedImage olup olmadığını kontrol edin.

// 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, bir artırılmış görüntü algıladığında bu artırılmış görüntü için bir Trackable oluşturur ve ArTrackingState değerini TRACKING, ArAugmentedImageTrackingMethod değerini ise FULL_TRACKING olarak ayarlar. İzlenen resim kamera görüş alanından çıktığında ARCore, ArTrackingState değerini TRACKING olarak ayarlamaya devam eder ancak resmin yönünü ve konumunu sağlamaya devam ederken ArAugmentedImageTrackingMethod değerini LAST_KNOWN_POSE olarak değiştirir.

Uygulamanız, amaçlanan kullanım alanına bağlı olarak izleme durumunu ve izleme yöntemini farklı şekilde kullanmalıdır.

  • Sabit resimler. Yerine sabitlenmiş (yani hareket etmesinin beklenmediği) resimlerin yer aldığı çoğu kullanım alanında, resmin algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için ArTrackingState kullanılabilir. ArAugmentedImageTrackingMethod yoksayılabilir.

  • Hareketli resimler. Uygulamanızın hareketli bir resmi izlemesi gerekiyorsa resmin algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için hem ArTrackingState hem de ArAugmentedImageTrackingMethod'ü kullanın.

Kullanım alanı Sabit resim Resim taşınıyor
Örnek Duvara asılı bir poster Bir otobüsün yan tarafındaki reklam
Durum aşağıdaki durumlarda
geçerli olarak kabul edilebilir:
ArTrackingState == TRACKING ArTrackingState == TRACKING
ve
ArAugmentedImageTrackingMethod == FULL_TRACKING