מבצעים בדיקת היט כדי לקבוע את המיקום הנכון של אובייקט תלת-ממדי בסצנה. מיקום נכון מבטיח שתוכן ה-AR יעובד בגודל המתאים (הנראה).
סוגים של תוצאות היטים
בדיקת היט יכולה להניב ארבעה סוגים שונים של תוצאות היטים, כפי שמוצג בטבלה הבאה.
סוג תוצאת ההיט | תיאור | כיוון | תרחיש לדוגמה | קריאות לשיטות |
---|---|---|---|---|
עומק (AR_TRACKABLE_DEPTH_POINT ) |
נעשה שימוש במידע על העומק מכל הסצנה כדי לקבוע את העומק והכיוון הנכונים של נקודה | מאונך לפני השטח התלת-ממדי | מניחים אובייקט וירטואלי על משטח שרירותי (לא רק על רצפות וקירות) |
כדי שזה יעבוד, צריך להפעיל את ArDepthMode .ArFrame_hitTest , חיפוש ArDepthPoint ברשימת ההחזרה
|
מטוס (AR_TRACKABLE_PLANE ) |
פגיעה על משטחים אופקיים או אנכיים כדי לקבוע את העומק והכיוון הנכונים של נקודה | מאונך לפני השטח התלת-ממדי | מציבים עצם על מישור (רצפה או קיר) לפי הגיאומטריה המלאה של המטוס. צריך לתקן את קנה המידה באופן מיידי. חלופי למבחן העומק |
ArFrame_hitTest , מחפשים ArPlane ברשימת ההחזרה
|
נקודת פיצ'ר (AR_TRACKABLE_POINT ) |
התכונה הזו מתבססת על תכונות חזותיות מסביב לנקודת ההקשה של המשתמש כדי לקבוע את המיקום והכיוון הנכונים של הנקודה | מאונך לפני השטח התלת-ממדי | מניחים אובייקט על משטח שרירותי (לא רק על רצפות וקירות) |
ArFrame_hitTest , מחפשים ArPoint ברשימת ההחזרה
|
מיקום מודעה מיידית (AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) |
משתמש בשטח המסך למיקום התוכן. בהתחלה נעשה שימוש בעומק המשוער שסופק על ידי האפליקציה. התמונה פועלת באופן מיידי, אבל התנוחה והעומק האמיתי ישתנו ברגע ש-ARCore יוכל לזהות את הגיאומטריה של הסצנה בפועל | +Y שמצביע למעלה, נגד כוח הכבידה | מציבים עצם על מישור (רצפה או קיר) באמצעות הגיאומטריה המלאה של המטוס, כשהמיקום המהיר הוא קריטי, והחוויה יכולה להכיל עומק וקנה מידה לא ידועים. |
ArFrame_hitTestInstantPlacement
|
ביצוע בדיקת היט רגילה
קוראים לפונקציה ArFrame_hitTest
כדי לבצע בדיקת היט.
ArHitResultList* hit_result_list = NULL; ArHitResultList_create(ar_session, &hit_result_list); CHECK(hit_result_list); if (is_instant_placement_enabled) { ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y, k_approximate_distance_meters, hit_result_list); } else { ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list); }
ניתן לסנן את תוצאות ההיטים לפי הסוג שמעניין אתכם. לדוגמה, כדי להתמקד בArPlane
:
int32_t hit_result_list_size = 0; ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size); // Returned hit-test results are sorted by increasing distance from the camera // or virtual ray's origin. The first hit result is often the most relevant // when responding to user input. ArHitResult* ar_hit_result = NULL; for (int32_t i = 0; i < hit_result_list_size; ++i) { ArHitResult* ar_hit = NULL; ArHitResult_create(ar_session, &ar_hit); ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit); if (ar_hit == NULL) { LOGE("No item was hit."); return; } ArTrackable* ar_trackable = NULL; ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable); ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID; ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type); // Creates an anchor if a plane was hit. if (ar_trackable_type == AR_TRACKABLE_PLANE) { // Do something with this hit result. For example, create an anchor at // this point of interest. ArAnchor* anchor = NULL; ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor); // TODO: Use this anchor in your AR experience. ArAnchor_release(anchor); ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); break; } ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); } ArHitResultList_destroy(hit_result_list);
ביצוע בדיקת היט באמצעות קרן וכיוון שרירותיים
בדיקות פגיעה בדרך כלל מתייחסות לקרניים מהמכשיר או ממצלמה של המכשיר, אבל אפשר להשתמש ב-ArFrame_hitTestRay
כדי לבצע בדיקת התאמה באמצעות קרן שרירותית בקואורדינטות של מרחב עולמיות במקום בנקודה על גבי מסך.
צירוף קובץ עוגן ל-Hhitמעבדת
אחרי שמקבלים תוצאת היט, אפשר להשתמש בתנוחה שלה כדי למקם תוכן AR בסצנה. משתמשים ב-ArHitResult_acquireNewAnchor
כדי ליצור עוגן חדש במיקום ההיט.
מה השלב הבא?
- כדאי לבדוק את האפליקציה לדוגמה
hello_ar_c
ב-GitHub.