ทำการทดสอบ Hit ในแอป NDK ของ Android

ทำ Hit-Test เพื่อหาตำแหน่งที่ถูกต้องของวัตถุ 3 มิติในฉากของคุณ การวางตำแหน่งที่ถูกต้องช่วยให้มั่นใจได้ว่าเนื้อหา AR จะแสดงผลในขนาดที่เหมาะสม (ชัดเจน)

ประเภทผลลัพธ์ Hit

การทดสอบ Hit สามารถให้ผลลัพธ์ Hit ที่แตกต่างกัน 4 ประเภทตามที่แสดงในตารางต่อไปนี้

ประเภทผลลัพธ์ Hit คำอธิบาย การวางแนว Use Case การเรียกใช้เมธอด
ความลึก (AR_TRACKABLE_DEPTH_POINT) ใช้ข้อมูลความลึกจากฉากทั้งหมดเพื่อกำหนดความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุเสมือนจริงบนพื้นผิวที่กำหนดเอง (ไม่ใช่แค่บนพื้นและผนัง) ต้องเปิดใช้ ArDepthMode เพื่อให้ดำเนินการได้

ArFrame_hitTest ตรวจหา ArDepthPoint ในรายการส่งคืน
เครื่องบิน (AR_TRACKABLE_PLANE) กระทบพื้นผิวแนวนอนและ/หรือแนวตั้งเพื่อกำหนดความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนเครื่องบิน (พื้นหรือผนัง) โดยใช้รูปเรขาคณิตเต็มของเครื่องบิน ต้องใช้สเกลที่ถูกต้องทันที สำรองสำหรับการทดสอบ Hit ความลึก ArFrame_hitTest ตรวจดู ArPlane ในรายการการคืนสินค้า
จุดของฟีเจอร์ (AR_TRACKABLE_POINT) อาศัยฟีเจอร์ภาพรอบๆ จุดที่ผู้ใช้แตะเพื่อกำหนดตำแหน่งและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนพื้นผิวที่กำหนดเอง (ไม่ใช่แค่บนพื้นและผนัง) ArFrame_hitTest ตรวจดู ArPoint ในรายการการคืนสินค้า
ตำแหน่งโฆษณาทันใจ (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) ใช้พื้นที่หน้าจอในการวางเนื้อหา เริ่มแรกจะใช้ความลึกโดยประมาณที่แอปให้ไว้ ทำงานได้ในทันที แต่การโพสท่าและความลึกจริงจะเปลี่ยนไปเมื่อ ARCore กำหนดเรขาคณิตของฉากจริงได้ +Y ชี้ขึ้น ตรงข้ามกับแรงโน้มถ่วง วางวัตถุบนระนาบ (พื้นหรือผนัง) โดยใช้รูปทรงเรขาคณิตเต็มของระนาบ โดยจำเป็นต้องมีการวางตำแหน่งอย่างรวดเร็ว และประสบการณ์ที่ได้จะทนต่อความลึกและมาตราส่วนเริ่มต้นที่ไม่ทราบ ArFrame_hitTestInstantPlacement

ทำการทดสอบ Hit มาตรฐาน

เรียก ArFrame_hitTest เพื่อทำการทดสอบ Hit

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);
}

กรองผลลัพธ์ Hit ตามประเภทที่คุณสนใจ ตัวอย่างเช่น หากคุณต้องการมุ่งเน้นที่ 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);

ทำการทดสอบ Hit โดยใช้แสงและทิศทางที่กำหนดเอง

โดยทั่วไป Hit-test จะถือว่าเป็นรังสีจากอุปกรณ์หรือกล้องของอุปกรณ์ แต่คุณสามารถใช้ ArFrame_hitTestRay เพื่อทำการทดสอบ Hit โดยใช้รังสีที่กำหนดเองในพิกัดอวกาศของโลกแทนการใช้จุดกับพื้นที่หน้าจอ

ต่อเชื่อม Anchor กับ HitResult

เมื่อได้รับผลลัพธ์ Hit แล้ว คุณจะใช้ท่าทางเป็นอินพุตเพื่อวางเนื้อหา AR ในฉากได้ ใช้ ArHitResult_acquireNewAnchor เพื่อสร้างแท็ก Anchor ใหม่ที่ตำแหน่ง Hit

สิ่งที่จะเกิดขึ้นหลังจากนี้

  • ดูแอป hello_ar_c ตัวอย่างใน GitHub