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

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

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

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

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

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

ביצוע בדיקת היטים רגילה

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

יצירת צ'אט מובנה באמצעות תוצאת ההיט

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

מה השלב הבא?