ביצוע בדיקות היט באפליקציית Android NDK

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