เล่น raycast ในแอป Unity (AR Foundation)

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

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

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

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

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
เครื่องบิน กระทบพื้นผิวแนวนอนและ/หรือแนวตั้งเพื่อกำหนดความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนเครื่องบิน (พื้นหรือผนัง) โดยใช้รูปเรขาคณิตเต็มของเครื่องบิน ต้องใช้สเกลที่ถูกต้องทันที สำรองสำหรับการทดสอบ Hit ความลึก ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
จุดสนใจ อาศัยฟีเจอร์ภาพรอบๆ จุดที่ผู้ใช้แตะเพื่อกำหนดตำแหน่งและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 3 มิติ วางวัตถุบนพื้นผิวที่กำหนดเอง (ไม่ใช่แค่บนพื้นและผนัง) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
Persistent Raycast (ตำแหน่งทันที) ใช้พื้นที่หน้าจอในการวางเนื้อหา เริ่มแรกจะใช้ความลึกโดยประมาณที่แอปให้ไว้ ทำงานได้ในทันที แต่การโพสท่าและความลึกจริงจะเปลี่ยนไปเมื่อ ARCore กำหนดเรขาคณิตของฉากจริงได้ +Y ชี้ขึ้น ตรงข้ามกับแรงโน้มถ่วง วางวัตถุบนระนาบ (พื้นหรือผนัง) โดยใช้รูปทรงเรขาคณิตเต็มของระนาบ โดยจำเป็นต้องมีการวางตำแหน่งอย่างรวดเร็ว และประสบการณ์ที่ได้จะทนต่อความลึกและมาตราส่วนเริ่มต้นที่ไม่ทราบ ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

ทำรังสีเรย์คาสต์มาตรฐาน

เรียก ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) เพื่อทำเรย์แคสต์ (Hit-test) ARRaycastManager รองรับ TrackableType ทั้งหมด

var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
    return;

// Raycast against planes and feature points.
const TrackableType trackableTypes =
    TrackableType.FeaturePoint |
    TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
    // Raycast hits are sorted by distance, so the first one will be the closest hit.
    var hit = hits[0];
    // Do something with hit.
}

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

โดยทั่วไป Raycast จะถือว่าเป็นรังสีจากอุปกรณ์หรือกล้องของอุปกรณ์ แต่คุณสามารถใช้ Raycast(Ray, List<ARRaycastHit>, TrackableType) เพื่อทำraycast โดยใช้รังสีที่กำหนดเองในพิกัดพื้นที่โลกแทนการใช้จุดกับพื้นที่หน้าจอ

สร้าง Anchor โดยใช้ ARRaycastHit

เมื่อได้รับ Hit ของ Raycast ให้ใช้ GameObject.AddComponent<ARAnchor> เพื่อสร้างแท็ก Anchor และเพิ่มเป็นคอมโพเนนต์ลงใน GameObject โดยใช้ Hit เรย์แคสต์เป็นอินพุต คอมโพเนนต์ ARAnchor จะอัปเดต Transform ของออบเจ็กต์เกมอย่างต่อเนื่อง เพื่อให้ออบเจ็กต์เกมยังคงแนบอยู่กับ Trackable เบื้องหลังสำหรับผลลัพธ์ของ Hit

เรย์คาสต์ต่อเนื่อง (ตำแหน่งทันใจ)

การฉายรังสีอย่างต่อเนื่องจะใช้ตำแหน่งหน้าจอและระยะทางไปยังพื้นผิวโดยประมาณเป็นอินพุตเพื่อสร้าง ARRaycast ใหม่เพื่อวางเนื้อหา AR ในฉาก ใน ARCore จะเรียกว่าตำแหน่งทันที

โปรดโทรหา ARRaycastManager.AddRaycast() เพื่อสร้าง ARRaycast ที่จะอัปเดตโดยอัตโนมัติอย่างต่อเนื่องจนกว่าคุณจะโทรหา ARRaycastManager.RemoveRaycast() หรือปิดใช้ ARRaycastManager

ในขั้นต้น ระยะทางของ ARRaycast จะเป็นระยะทางที่ระบุไว้ในการโทร AddRaycast() เมื่อ ARCore จับคู่เรขาคณิตในพื้นที่และพบระนาบตัดกัน ระยะทางจะอัปเดตเป็นระยะทางจริง การเปลี่ยนแปลงระยะทางอาจส่งผลต่อ "ขนาด" หรือขนาดที่รับรู้ได้ของวัตถุ

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