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

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

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

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

ประเภทผลการค้นหา Hit คำอธิบาย การวางแนว กรณีการใช้งาน การเรียกเมธอด
ความลึก ใช้ข้อมูลความลึกจากทั้งฉากเพื่อกำหนดความลึกและการวางแนวที่ถูกต้องของจุด ตั้งฉากกับพื้นผิว 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)
เรย์แคสต์แบบถาวร (การวางโฆษณาทันที) ใช้พื้นที่หน้าจอในการวางเนื้อหา ในช่วงแรกจะใช้ความลึกโดยประมาณที่แอประบุ ใช้งานได้ทันที แต่ท่าทางและความลึกจริงจะเปลี่ยนไปเมื่อ 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(Ray, List<ARRaycastHit>, TrackableType) เพื่อทำการแรย์แคสต์โดยใช้รังสีที่กำหนดเองในพิกัดพื้นที่โลกแทนจุดในหน้าจอได้

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

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

เรย์แคสต์แบบถาวร (การวางโฆษณาทันที)

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

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

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

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