בדרך כלל, Subspace רגיל נשאר במיקום קבוע שנקבע על ידי המערכת, אבל לפעמים אתם רוצים שממשק המשתמש המרחבי של האפליקציה יזוז באופן דינמי עם המשתמש או יישאר צמוד למיקום ספציפי בסביבה שלו או בעולם האמיתי. אתם יכולים להעביר FollowTarget לפרמטר follow של Subspace כדי ליצור חוויות כמו תצוגות עילית (HUD) שנעולות על הראש או לוחות מידע שמצורפים לאובייקטים בעולם האמיתי.
הוספת מרחב משנה שעוקב אחרי התצוגה של המשתמש
כדי להוסיף מרחב משנה שממוקם ביחס לשדה הראייה של המשתמש, משתמשים ב-FollowTarget.view. בהתאם למצב המעקב שאתם מציינים, אתם יכולים לעקוב באופן רציף אחרי תנועות הראש של המשתמש או להציב תוכן באופן סטטי בהתאם למקום שאליו הוא מסתכל. אפשר להשתמש בזה לדברים כמו תצוגה עילית (HUD), התראות קבועות או פקדים לפעולות מהירות.
הצהרה על הרשאות ובקשת הרשאות
לפני שאתם מבקשים הרשאות, אתם צריכים להצהיר עליהן בקובץ המניפסט של האפליקציה באמצעות הרכיב <uses-permission>.
<manifest ...>
<!-- Only declare permissions that your app actually needs. In this example,
we declare permissions for head tracking. -->
<uses-permission android:name="android.permission.HEAD_TRACKING"/>
<application ...>
...
</application>
</manifest>
עכשיו מבקשים את ההרשאות. כדי לוודא שאתם מספקים את חוויית המשתמש הטובה ביותר, מומלץ לעיין בעקרונות ובתהליכי העבודה של ההרשאות, למשל לבדוק אם המשתמש כבר העניק את ההרשאות בתחילת ההפעלה שהאפליקציה דורשת, ואם האפליקציה צריכה להציג הסבר למשתמש לפני בקשת ההרשאה הזו.
הגדרת הסשן
בשלב הבא, מגדירים את הסשן של האפליקציה שנוצר כשמשתמשים ב-Jetpack Compose for XR באמצעות הגדרת DeviceTrackingMode.SPATIAL:
val session = checkNotNull(LocalSession.current)
session.configure(
config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
.build()
)
יצירת מרחב המשנה
בשלב האחרון, יוצרים מרחב משנה שמטרגט את התצוגה של המשתמש, יחד עם מצב מעקב:
// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
follow = FollowTarget.view(
// Customizing the soft follow to move slightly faster and tracking all dimensions
mode = FollowMode.soft(
)
),
modifier = modifier,
) {
SpatialPanel {
// SpatialPanel Content
}
}
מצבי מעקב במרחבי משנה שמטרגטים את התצוגה של המשתמש
כשמשתמשים ב-FollowTarget.view כיעד, אפשר להתאים אישית את אופן ההתנהגות של התוכן על ידי ציון FollowMode:
-
FollowMode.soft: התוכן מתעדכן בהדרגה בהתאם לתנועות של המטרה, וכך נוצר אפקט ריחוף חלק. -
FollowMode.snap: התוכן מוצג למשתמש פעם אחת בהתאם לתנוחת הצפייה הראשונית שלו, ואז נשאר במקום. FollowMode.tight: התוכן עוקב אחרי תנועת המשתמש באופן מיידי, עם עיכוב מינימלי, כך שהתוכן נשאר קשור באופן הדוק לתנועה שלו.
בכל מצבי המעקב אפשר לבחור אילו מאפייני תנועה יזוהו מבין האפשרויות הבאות:
- ציר ה-X
- ציר ה-Y
- גובה צליל
- הטלת קובייה
- סבסוב
-
RotationOnly: מאפשר לציין ערך יחיד למעקב אחרי המאפיינים שקשורים לסיבוב (עלרוד, סבסוב וגלגול).
אפשר לבחור כל שילוב של המאפיינים האלה, או להשתמש בערך ברירת המחדל TrackedDimensions.All שעוקב אחרי כולם.
הוספת מרחב משנה שעוקב אחרי מאפיין סביבתי
כדי להוסיף מרחב משנה שנועל את התוכן המרחבי באופן קפדני לתכונה פיזית בסביבת המשתמש, משתמשים ב-FollowTarget.anchor(). אפשר להשתמש בסוג היעד הזה כדי לעקוב אחרי מישור שזוהה, עוגן או מיקום גיאו-מרחבי.
כדי לעקוב אחרי תכונות בעולם האמיתי, צריך הרשאות נוספות והגדרות סשן בהתאם לתכונה שאחריה עוקבים.
במסמכי התיעוד של Jetpack XR SDK בנושא מישורים, עוגנים ותנוחות גיאוגרפיות מוסבר בפירוט איך לעבוד עם יכולות התפיסה של תכונות ARCore, ואיך להגדיר את ההרשאות הנדרשות ואת הסשן לשימוש ב-FollowTarget.anchor().
בדוגמה הבאה נוצר מרחב משנה שעוקב אחרי עוגן בעולם האמיתי:
// A subspace locked to a real-world anchor
Subspace(
follow = FollowTarget.anchor(anchor = myAnchor)
) {
// Rotate the panel to ensure it faces the user while remaining anchored
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
// SpatialPanel Content
}
}
הימנעו מחפיפה מרחבית
כל Subspace שאתם יוצרים מנהל סצנה תלת-ממדית עצמאית משלו, ואין לו מודעות למרחבי משנה אחרים שקיימים, כך שהוא לא מונע התנגשויות באופן אוטומטי.
כדי למנוע מצב שבו ה-HUD שנעול לראש חותך את לוחות נקודות העניין המעוגנים (Z-fighting), צריך לנהל באופן מפורש את נפחי הפריסה באמצעות השיטות הבאות:
- שימוש בהיסטים: משתמשים ב-
SubspaceModifier.offsetכדי להזיז את ממשק המשתמש ההיקפי (כמו ה-HUD) קרוב יותר או רחוק יותר בציר ה-Z, או להזיז אותו לקצוות של שדה הראייה של המשתמש. - הגבלת גדלים: אפשר להחיל מגבילים כמו
requiredSizeInכדי להגביל את התיבות התוחמות של המרחבים.
למידע נוסף על מרחבי קואורדינטות, אילוצי פריסה וכל הגדרות המעקב הזמינות, עיינו במאמרי העזרה של Subspace.