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

ทำ Raycast แบบมาตรฐาน

เรียกใช้ ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) เพื่อออกอากาศ Raycast (การทดสอบ Hit) 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

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

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

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

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

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

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