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

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

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

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

סוג תוצאת היט התיאור כיוון תרחיש לדוגמה קריאות ל-method
עומק (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

ביצוע של hit-test רגילה

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

צירוף עוגן לתוצאת התאמה

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

מה השלב הבא?

  • כדאי לך לראות את האפליקציה לדוגמה hello_ar_c ב-GitHub.