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

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

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

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

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

Frame.hitTest(…) ตรวจสอบ DepthPoint ในรายการผลลัพธ์
Plane ตีพื้นผิวแนวนอนและ/หรือแนวตั้งเพื่อระบุความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนระนาบ (พื้นหรือผนัง) โดยใช้รูปเรขาคณิตแบบเต็มของระนาบ ต้องปรับขนาดให้ถูกต้องทันที สำรองสำหรับการทดสอบ Depth Hit Frame.hitTest(…) โปรดตรวจหา Plane ในรายการส่งคืน
จุดของฟีเจอร์ (Point) ใช้ฟีเจอร์ภาพรอบๆ จุดที่ผู้ใช้แตะเพื่อกำหนดตำแหน่งและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนพื้นผิวที่กำหนดเอง (ไม่ใช่แค่บนพื้นและผนัง) Frame.hitTest(…) โปรดตรวจหา Point ในรายการส่งคืน
ตำแหน่งโฆษณาทันที (InstantPlacementPoint) ใช้พื้นที่หน้าจอในการวางเนื้อหา ในช่วงแรกจะใช้ความลึกโดยประมาณที่แอประบุ ใช้งานได้ทันที แต่ท่าทางและความลึกจริงจะเปลี่ยนไปเมื่อ ARCore ระบุเรขาคณิตของฉากจริงได้ +Y ชี้ขึ้น ตรงข้ามกับแรงโน้มถ่วง วางวัตถุบนระนาบ (พื้นหรือผนัง) โดยใช้รูปเรขาคณิตแบบเต็มของระนาบโดยการวางตำแหน่งที่รวดเร็วเป็นสิ่งที่สำคัญมาก และประสบการณ์ที่รองรับความลึกและขนาดเริ่มต้นที่ไม่ทราบสาเหตุ Frame.hitTestInstantPlacement(float, float, float)

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

เรียกใช้ Frame.hitTest() เพื่อทำการทดสอบ Hit โดยใช้ยูทิลิตี TapHelper เพื่อรับ MotionEvent จากมุมมอง AR

JavaKotlin
MotionEvent tap = tapHelper.poll();
if (tap == null) {
 
return;
}

if (usingInstantPlacement) {
 
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
 
// how far away the anchor will be placed, relative to the camera's view.
 
List<HitResult> hitResultList =
      frame
.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
 
// Hit-test results using Instant Placement will only have one result of type
 
// InstantPlacementResult.
} else {
 
List<HitResult> hitResultList = frame.hitTest(tap);
 
// TODO: Filter hitResultList to find a hit result of interest.
}
val tap = tapHelper.poll() ?: return
val hitResultList =
 
if (usingInstantPlacement) {
   
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
   
// how far away the anchor will be placed, relative to the camera's view.
    frame
.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
   
// Hit-test results using Instant Placement will only have one result of type
   
// InstantPlacementResult.
 
} else {
    frame
.hitTest(tap)
 
}

กรองผลลัพธ์ของ Hit ตามประเภทที่คุณสนใจ เช่น หากต้องการเน้นที่DepthPoint ให้ทำดังนี้

JavaKotlin
// 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.
for (HitResult hit : hitResultList) {
 
Trackable trackable = hit.getTrackable();
 
if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
   
// Do something with this hit result. For example, create an anchor at this point of
   
// interest.
   
Anchor anchor = hit.createAnchor();
   
// TODO: Use this anchor in your AR experience.
   
break;
 
}
}
// 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.
val firstHitResult =
  hitResultList
.firstOrNull { hit ->
   
when (val trackable = hit.trackable!!) {
     
is DepthPoint -> true // Replace with any type of trackable type
     
else -> false
   
}
 
}
if (firstHitResult != null) {
 
// Do something with this hit result. For example, create an anchor at this point of interest.
 
val anchor = firstHitResult.createAnchor()
 
// TODO: Use this anchor in your AR experience.
}

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

โดยทั่วไปแล้ว ระบบจะถือว่า Hit-Test เป็นรังสีจากอุปกรณ์หรือกล้องของอุปกรณ์ แต่คุณใช้ Frame.hitTest(float[], int, float[], int) เพื่อทำการ Hit-Test โดยใช้รังสีที่กำหนดเองในพิกัดพื้นที่โลกแทนจุดในหน้าจอได้

สร้าง Anchor โดยใช้ผลลัพธ์ของ Hit

เมื่อได้ผลการค้นหา Hit คุณสามารถใช้ท่าทางของข้อความนั้นเป็นอินพุตเพื่อวางเนื้อหา AR ในฉากได้ ใช้ HitResult.createAnchor() เพื่อสร้าง Anchor ใหม่ โดยให้เนื้อหาแนบกับ Trackable เบื้องหลังของผลลัพธ์ Hit เช่น หมุดจะยังคงยึดอยู่กับเครื่องบินที่ตรวจพบสำหรับผลการชนเครื่องบิน จึงทำให้ดูเหมือนเป็นส่วนหนึ่งของโลกแห่งความเป็นจริง

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