ביצוע הקלטות raycast באפליקציית Unity (AR Foundation)

מבצעים raycast, או בדיקת היטים, כדי לקבוע את המיקום הנכון של אובייקט תלת-ממדי בסצנה. מיקום נכון מבטיח שתוכן ה-AR יעובד בגודל המתאים (הנראה).

סוגים של תוצאות היטים

בדיקת היט יכולה להניב ארבעה סוגים שונים של תוצאות היטים, כפי שמוצג בטבלה הבאה.

סוג תוצאת ההיט תיאור כיוון תרחיש לדוגמה קריאות לשיטות
עומק נעשה שימוש במידע על העומק מכל הסצנה כדי לקבוע את העומק והכיוון הנכונים של נקודה מאונך לפני השטח התלת-ממדי מניחים אובייקט וירטואלי על משטח שרירותי (לא רק על רצפות וקירות) כדי שזה יעבוד, צריך להפעיל את Depth.

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
מטוס פגיעה על משטחים אופקיים או אנכיים כדי לקבוע את העומק והכיוון הנכונים של נקודה מאונך לפני השטח התלת-ממדי מציבים עצם על מישור (רצפה או קיר) לפי הגיאומטריה המלאה של המטוס. צריך לתקן את קנה המידה באופן מיידי. חלופי למבחן העומק ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
נקודת פיצ'ר התכונה הזו מתבססת על תכונות חזותיות מסביב לנקודת ההקשה של המשתמש כדי לקבוע את המיקום והכיוון הנכונים של הנקודה מאונך לפני השטח התלת-ממדי מניחים אובייקט על משטח שרירותי (לא רק על רצפות וקירות) 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) כדי לבצע תדרי רדיו (בדיקת התאמה). יש תמיכה בכל הנכסים של TrackableType ב-ARRaycastManager.

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) כדי לבצע קרינה באמצעות קרן שרירותית בקואורדינטות של מרחב עולמי במקום נקודה על המסך.

יצירת עוגן באמצעות ARRaycastHit

אחרי שמקבלים היט מסוג קרניים, משתמשים ב-GameObject.AddComponent<ARAnchor> כדי ליצור עוגן ומוסיפים אותו כרכיב ל-GameObject, תוך שימוש בהיט של ה-raycast כקלט. הרכיב ARAnchor יעדכן באופן קבוע את Transform של אובייקט המשחק, כך שאובייקט המשחק יישאר מצורף ל-Trackable הבסיסי של תוצאת ההיט.

קרניים מתמשכות (מיקום מיידי)

מצלמות קרניים מתמשכות משתמשות במיקום המסך ובמרחק המשוער לפני השטח כקלט, כדי ליצור ARRaycast חדש למיקום של תוכן AR בסצנה. ב-ARCore, השיטה הזו נקראת מיקום מיידי.

קוראים למספר ARRaycastManager.AddRaycast() כדי ליצור ARRaycast שימשיך להתעדכן אוטומטית עד שתתקשרו אל ARRaycastManager.RemoveRaycast() או עד שתשביתו את ARRaycastManager.

בהתחלה, המרחק של ARRaycast יהיה המרחק שיסופק בשיחה AddRaycast(). אחרי ש-ARCore מיפה את הגיאומטריה המקומית ומצא מישור מצטלב, המרחק מתעדכן למרחק בפועל. השינוי במרחק יכול להשפיע על ה"גודל" או קנה המידה בפועל של האובייקט.

מה השלב הבא?