ARCore for Jetpack XR יכול לזהות משטחים שטוחים בסביבת המשתמש ולספק מידע עליהם, כמו המיקום, הגודל והכיוון שלהם. המידע הזה יכול לעזור לאפליקציה למצוא משטחים כמו שולחנות כדי להניח עליהם אובייקטים.
יצירת פעילות ARCore ל-Jetpack XR
גישה למידע על מישור דרך סשן ARCore for Jetpack XR. במאמר הסבר על מחזור החיים של סשן מוסבר איך מקבלים Session
.
הגדרת הסשן
זיהוי מישור לא מופעל כברירת מחדל בפעילויות XR. כדי להפעיל מעקב אחרי מישור, מגדירים את הסשן ומגדירים את המצב PlaneTrackingMode.HORIZONTAL_AND_VERTICAL
:
val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) }
אחזור המצב של מישורים נתפסים
ARCore for Jetpack XR מספק את מצב המישורים באמצעות StateFlow
שפולט את מצב המישורים. כשנרשמים כמנויים למישורי קרקע בסשן, האפליקציה מקבלת הודעה כשמישורי קרקע מתווספים, מתעדכנים או מוסרים.
Plane.subscribe(session).collect { planes -> // Planes have changed; update plane rendering }
למישור יש את המאפיינים הבאים:
-
label
: תיאור סמנטי שלPlane
נתון. יכול להיותWALL
,FLOOR
,CEILING
אוTABLE
. -
centerPose
: התנוחה של מרכז המישור שזוהה. -
extents
: המידות של המטוס שזוהה, במטרים. -
vertices
: רשימה של קודקודים של מצולע קמור שמבצע קירוב למישור.
ביצוע בדיקת כניסות מול מישורים
בדיקת פגיעה היא שיטה לחישוב נקודת החיתוך של קרן עם אובייקטים שנמצאים במעקב על ידי הסשן. אחת מהדרכים הנפוצות להשתמש בבדיקת פגיעה היא להצביע על שולחן ולהציב אובייקט במיקום הזה. ביצוע בדיקת פגיעה מניב רשימה של אובייקטים שנפגעו. במילים אחרות, בדיקת הפגיעה לא נעצרת באובייקט הראשון שנפגע. עם זאת, לעיתים קרובות יכול להיות שתתעניינו רק בפגיעה הראשונה באובייקט מסוג מסוים.
כדי לבצע בדיקת פגיעה, משתמשים ב-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 }