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