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

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

ประเภทผลการค้นหา Hit

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

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

คุณ ArFrame_hitTest โปรดตรวจหา ArDepthPoint ในรายการส่งคืน
เครื่องบิน (AR_TRACKABLE_PLANE) ตีพื้นผิวแนวนอนและ/หรือแนวตั้งเพื่อระบุความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนระนาบ (พื้นหรือผนัง) โดยใช้รูปเรขาคณิตแบบเต็มของระนาบ ต้องมีการปรับขนาดที่ถูกต้องทันที สำรองสำหรับการทดสอบ Depth 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 มักเป็นรังสีจากอุปกรณ์หรือกล้องของอุปกรณ์ แต่คุณใช้ ArFrame_hitTestRay ทำการทดสอบ Hit โดยใช้รังสีที่กำหนดเองในพิกัดอวกาศในโลกแทนการใช้จุดพื้นที่หน้าจอได้

แนบ Anchor กับ Hitผลลัพธ์

เมื่อได้ผลการค้นหา Hit คุณสามารถใช้ท่าทางของข้อความนั้นเป็นอินพุตเพื่อวางเนื้อหา AR ในฉากได้ ใช้ ArHitResult_acquireNewAnchor เพื่อสร้างโฆษณา Anchor ใหม่ในตำแหน่ง Hit

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

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