ทำ 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