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