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

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

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

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

סוג תוצאת היט התיאור כיוון תרחיש לדוגמה קריאות ל-method
עומק (DepthPoint) שימוש בנתוני עומק מכל הסצנה כדי לקבוע את העומק והכיוון הנכונים של הנקודה אנכי למשטח התלת-ממדי יש למקם אובייקט וירטואלי על משטח שרירותי (לא רק על רצפות וקירות) כדי לעשות זאת, צריך להפעיל את ArDepthMode.

Frame.hitTest(…), יש לבדוק אם יש DepthPoint ברשימת ההחזרות
Plane פגיעות על פני שטח אופקיים ו/או אנכיים כדי לקבוע את העומק והכיוון הנכונים של נקודה אנכי למשטח התלת-ממדי מניחים אובייקט על מישור (רצפה או קיר) באמצעות הגיאומטריה המלאה של המטוס. דרוש קנה מידה נכון באופן מיידי. להיענות לבדיקת העומק Frame.hitTest(…), יש לבדוק אם יש Plane ברשימת ההחזרות
נקודת ציון (Point) הסתמכות על תכונות חזותיות מסביב לנקודת ההקשה של המשתמש כדי לקבוע את המיקום והכיוון הנכונים של הנקודה אנכי למשטח התלת-ממדי מניחים אובייקט על משטח שרירותי (לא רק על רצפות וקירות) Frame.hitTest(…), יש לבדוק אם יש Point ברשימת ההחזרות
מיקום מיידי (InstantPlacementPoint) מנצלים את שטח המסך למיקום התוכן. נעשה שימוש במקור בעומק המשוער שסופק על ידי האפליקציה. זה פועל באופן מיידי, אבל המיקום והעומק בפועל ישתנו ברגע ש-ARCore יוכל לזהות את הגאומטריה של הסצנה בפועל. +Y מצביע למעלה, נגד כוח הכבידה מציבים עצם על מטוס (על הרצפה או על קיר) באמצעות הגיאומטריה המלאה של המטוס. המיקום המהיר הוא קריטי, והחוויה עשויה לסבול את העומק והקנה מידה הראשוניים לא ידועים. Frame.hitTestInstantPlacement(float, float, float)

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

אפשר להפעיל את Frame.hitTest() כדי לבצע בדיקת היט באמצעות הכלי TapHelper כדי לקבל MotionEvent מתצוגת AR.

Java

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Kotlin

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

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

Java

// 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.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Kotlin

// 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.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

ביצוע בדיקה באמצעות קרן וכיוון שרירותיים

בדיקות היטים נחשבות בדרך כלל כקרניים שמגיעות ממצלמת המכשיר או ממצלמת המכשיר, אבל אפשר להשתמש ב-Frame.hitTest(float[], int, float[], int) כדי לבצע היט (hit) באמצעות קרן שרירותית בקואורדינטות של החלל בעולם, במקום בנקודה של מרחב מסך.

יצירת עוגן באמצעות תוצאת ההיט

אחרי שמקבלים תוצאת היט, אפשר להשתמש בתנוחה שלה כקלט כדי להוסיף תוכן AR לסצנה. משתמשים ב-HitResult.createAnchor() כדי ליצור Anchor חדש, ומוודאים שהתוכן מצורף ל-Trackable המקורי של תוצאת ההיט. לדוגמה, העוגן יישאר מצורף למישור שזוהה עבור תוצאה של היט מטוס, וכך ייראה כאילו הוא חלק מהעולם האמיתי.

מה השלב הבא?