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

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

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

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

סוג תוצאת היט התיאור כיוון תרחיש לדוגמה קריאות ל-method
עומק שימוש בנתוני עומק מכל הסצנה כדי לקבוע את העומק והכיוון הנכונים של הנקודה אנכי למשטח התלת-ממדי יש למקם אובייקט וירטואלי על משטח שרירותי (לא רק על רצפות וקירות) כדי לעשות זאת, צריך להפעיל את 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)
Persistent Raycast (מיקום מיידי) מנצלים את שטח המסך למיקום התוכן. נעשה שימוש במקור בעומק המשוער שסופק על ידי האפליקציה. זה פועל באופן מיידי, אבל המיקום והעומק בפועל ישתנו ברגע ש-ARCore יוכל לזהות את הגאומטריה של הסצנה בפועל. +Y מצביע למעלה, נגד כוח הכבידה מציבים עצם על מטוס (על הרצפה או על קיר) באמצעות הגיאומטריה המלאה של המטוס. המיקום המהיר הוא קריטי, והחוויה עשויה לסבול את העומק והקנה מידה הראשוניים לא ידועים. ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

ביצוע raycast רגיל

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

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

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

סריקות קבועות (מיקום מיידי)

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

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

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

מה השלב הבא?