ARCore ל-Jetpack XR יכול לזהות משטחים שטוחים בסביבת המשתמש ולספק מידע עליהם, כמו תנוחתם, הגודל והכיוון שלהם. כך האפליקציה תוכל למצוא משטחים כמו שולחנות כדי להציב בהם אובייקטים.
יצירת סשן של ARCore ל-Jetpack XR
גישה למידע על המטוס באמצעות סשן של ARCore for Jetpack XR. במאמר הסבר על מחזור החיים של סשן מוסבר איך לקבל Session
.
הגדרת הסשן
התכונה 'זיהוי מישורים' לא מופעלת כברירת מחדל בסשנים של XR. כדי להפעיל מעקב אחרי מטוסים, מגדירים את הסשן:
val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HorizontalAndVertical, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) }
אחזור המצב של המטוסים הנראים
ARCore ל-Jetpack XR מספק את המצב של המטוסים באמצעות StateFlow
שמפיץ את המצב של המטוסים. כשנרשמים למטוסים בסשן, האפליקציה מקבלת התראות כשמטוסים מתווספים, מתעדכנים או מוסרים.
Plane.subscribe(session).collect { planes -> // Planes have changed; update plane rendering }
למטוס יש את המאפיינים הבאים:
label
: תיאור סמנטי שלPlane
נתון. יכול להיותWall
,Floor
,Ceiling
אוTable
.centerPose
: תנוחת מרכז המטוס שזוהה.extents
: המאפיינים של המטוס שזוהה, במטרים.vertices
: רשימה של קודקודים של פוליגון קמור שמתקרב למישן.
ביצוע בדיקת כניסה (hit-test) למטוסים
בדיקת התאמה היא שיטה לחישוב הצטלבות של קרן עם אובייקטים שנמצאים במעקב במהלך הסשן. שימוש נפוץ בבדיקה של אירוע היטה הוא להצביע על טבלה ולהציב אובייקט במיקום הזה. ביצוע בדיקת היטים מניב רשימה של אובייקטים שהוגדרו כהיטים. במילים אחרות, בדיקת ההיט לא נעצרת באובייקט הראשון שבו מתרחש היטים. עם זאת, לרוב אתם רוצים לקבל רק את ההיט הראשון של האובייקט מסוג נתון.
כדי לבצע בדיקת התאמה, משתמשים ב-Interaction.hitTest()
עם Ray
:
val results = androidx.xr.arcore.hitTest(session, ray) // When interested in the first Table hit: val tableHit = results.firstOrNull { val trackable = it.trackable trackable is Plane && trackable.state.value.label == Plane.Label.Table }