ทำ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
Java
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. }
Kotlin
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
ให้ทำดังนี้
Java
// 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; } }
Kotlin
// 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 เช่น หมุดจะยังคงยึดอยู่กับเครื่องบินที่ตรวจพบสำหรับผลการชนเครื่องบิน จึงทำให้ดูเหมือนเป็นส่วนหนึ่งของโลกแห่งความเป็นจริง
สิ่งที่จะเกิดขึ้นหลังจากนี้
- ดูตัวอย่างแอป
hello_ar_java
และhello_ar_kotlin
ใน GitHub