Menjalankan hit-test di aplikasi Android NDK

Lakukan hit-test untuk menentukan penempatan objek 3D yang benar dalam scene. Penempatan yang benar memastikan konten AR dirender dengan ukuran yang sesuai (terlihat).

Jenis hasil hit

Hit-test dapat menghasilkan empat jenis hasil hit yang berbeda, seperti yang ditunjukkan pada tabel berikut.

Jenis hasil hit Deskripsi Orientasi Kasus penggunaan Panggilan metode
Dalam (AR_TRACKABLE_DEPTH_POINT) Menggunakan informasi kedalaman dari seluruh adegan untuk menentukan kedalaman dan orientasi titik yang benar Tegak lurus dengan permukaan 3D Menempatkan objek virtual di permukaan arbitrer (bukan hanya di lantai dan dinding) ArDepthMode harus diaktifkan agar dapat berfungsi.

ArFrame_hitTest, periksa ArDepthPoint di daftar pengembalian
Pesawat (AR_TRACKABLE_PLANE) Menekan permukaan horizontal dan/atau vertikal untuk menentukan kedalaman dan orientasi titik yang benar Tegak lurus dengan permukaan 3D Tempatkan objek pada bidang (lantai atau dinding) menggunakan geometri penuh bidang. Perlu timbangan yang benar segera. Pengganti untuk hit-test Depth ArFrame_hitTest, periksa ArPlane di daftar pengembalian
Poin fitur (AR_TRACKABLE_POINT) Mengandalkan fitur visual di sekitar titik ketukan pengguna untuk menentukan posisi dan orientasi titik yang benar Tegak lurus dengan permukaan 3D Meletakkan objek di permukaan arbitrer (bukan hanya di lantai dan dinding) ArFrame_hitTest, periksa ArPoint di daftar pengembalian
Penempatan Instan (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) Menggunakan ruang layar untuk menempatkan konten. Awalnya menggunakan perkiraan kedalaman yang disediakan oleh aplikasi. Berfungsi secara instan, tetapi pose dan kedalaman sebenarnya akan berubah setelah ARCore dapat menentukan geometri adegan yang sebenarnya +Y mengarah ke atas, berlawanan dengan gravitasi Letakkan objek di bidang (lantai atau dinding) menggunakan geometri penuh pesawat di mana penempatan yang cepat sangatlah penting, dan pengalaman ini dapat menoleransi kedalaman dan skala awal yang tidak diketahui ArFrame_hitTestInstantPlacement

Menjalankan hit-test standar

Panggil ArFrame_hitTest untuk melakukan hit test.

ArHitResultList* hit_result_list = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
CHECK(hit_result_list);
if (is_instant_placement_enabled) {
  ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y,
                                  k_approximate_distance_meters,
                                  hit_result_list);
} else {
  ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list);
}

Filter hasil hit berdasarkan jenis yang Anda minati. Misalnya, jika Anda ingin berfokus pada ArPlane:

int32_t hit_result_list_size = 0;
ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size);

// Returned hit-test results are sorted by increasing distance from the camera
// or virtual ray's origin. The first hit result is often the most relevant
// when responding to user input.
ArHitResult* ar_hit_result = NULL;
for (int32_t i = 0; i < hit_result_list_size; ++i) {
  ArHitResult* ar_hit = NULL;
  ArHitResult_create(ar_session, &ar_hit);
  ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit);

  if (ar_hit == NULL) {
    LOGE("No item was hit.");
    return;
  }

  ArTrackable* ar_trackable = NULL;
  ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable);
  ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID;
  ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type);
  // Creates an anchor if a plane was hit.
  if (ar_trackable_type == AR_TRACKABLE_PLANE) {
    // Do something with this hit result. For example, create an anchor at
    // this point of interest.
    ArAnchor* anchor = NULL;
    ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor);

    // TODO: Use this anchor in your AR experience.

    ArAnchor_release(anchor);
    ArHitResult_destroy(ar_hit);
    ArTrackable_release(ar_trackable);
    break;
  }
  ArHitResult_destroy(ar_hit);
  ArTrackable_release(ar_trackable);
}
ArHitResultList_destroy(hit_result_list);

Melakukan hit-test menggunakan sinar dan arah arbitrer

Hit-test biasanya diperlakukan sebagai sinar dari perangkat atau kamera perangkat, tetapi Anda dapat menggunakan ArFrame_hitTestRay untuk melakukan hit-test menggunakan sinar arbitrer dalam koordinat ruang dunia, bukan titik ruang layar.

Melampirkan Anchor ke HitResult

Setelah memiliki hasil hit, Anda dapat menggunakan posenya sebagai input untuk menempatkan konten AR di scene. Gunakan ArHitResult_acquireNewAnchor untuk membuat Anchor baru di lokasi hit.

Langkah selanjutnya