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

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 resimleri depolamak için bir ArAugmentedImageDatabase oluşturun. İki yol vardır:

  • Boş veritabanı oluşturun
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ı Image Tool ile veya ArAugmentedImageDatabase_serialize() çağrısı yapılarak oluşturulabilir.

Veritabanına görüntü ekleyin

İstediğiniz referans resimler 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() numaralı telefonu arayı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 tespit edildiğini tanımlamak için kullanılır.

Resim izlemeyi etkinleştir

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

Oturum sırasında ARCore, resim veritabanındakilerle eşleştirmek için kamera görüntüsündeki özellik noktalarını kullanır.

Artırılmış gerçeklik oturumlarında artırılmış görüntüleri bulma

Eşleşen resimleri almak için kare güncelleme döngünüzdeki güncellenmiş ArAugmentedImage için anket yapı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ış bir görüntü algıladığında söz konusu artırılmış resim için bir Trackable oluşturup ArTrackingState değerini TRACKING, ArAugmentedImageTrackingMethod değerini ise FULL_TRACKING olarak ayarlar. İzlenen resim kamera görünümünden çı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ın, izleme durumunu ve izleme yöntemini kullanım amacına bağlı olarak farklı şekillerde kullanması gerekir.

  • Sabit resimler. Sabitlenmiş (yani hareket etmesi beklenmeyen) görüntüleri içeren çoğu kullanım durumu, görüntünün algılanıp algılanmadığını ve konumunun bilinip bilinmediğini belirlemek için ArTrackingState özelliğini kullanabilir. ArAugmentedImageTrackingMethod yoksayılabilir.

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

Kullanım alanı Düzeltilmiş resim Resim taşınıyor
Örnek Duvara asılı poster Otobüsün yan tarafındaki reklam
Poz, şu durumlarda
geçerli kabul edilebilir:
ArTrackingState == TRACKING ArTrackingState == TRACKING
ve
ArAugmentedImageTrackingMethod == FULL_TRACKING