ב-Jetpack XR SDK, סביבות מרחביות הן סביבות סוחפות שאפשר להוסיף לאפליקציה כדי להתאים אישית את הרקע של הסצנה הווירטואלית. סביבות מרחביות גלויות רק כשאפליקציה נמצאת במצב מלא.
סקירה כללית על סביבות מרחבי
SpatialEnvironment
משמש לניהול ההעדפות של האפליקציה לגבי הסביבה המרחבית. הוא מורכב מתמונה עצמאית של סביבה ותלת-ממד של glTF. אפשר להגדיר רק תמונה אחת של תיבת שמיים וקובץ גיאומטריה אחד של glTF בכל פעם.
קופסת שמיים מייצגת את התמונה שהמשתמש רואה מסביבו בסצנה הווירטואלית, ויוצרת את האשליה של סביבה רחוקה ברקע, כמו שמיים, הרים או נופים עירוניים. המשתמש לא יכול ליצור אינטראקציה עם תיבת השמיים או להתקרב אליה. Jetpack XR SDK תומך בקופסאות שמיים ספריות בתקן OpenEXR. בנוסף ליצירת רקע immersive לאפליקציה, קובץ skybox בפורמט EXR מספק גם תאורה מבוססת-תמונה (IBL) למודלים תלת-ממדיים שנטענים באפליקציה. למידע נוסף, אפשר לעיין במדריך לעבודה עם מודלים תלת-ממדיים.
סביבות מרחביות יכולות לכלול גם תוכן של גיאומטריה תלת-ממדית בתקן glTF. גיאומטריה של סביבה שנטענת באופן הזה תתאים באופן אוטומטי לרצפה בעולם האמיתי. גיאומטריה של סביבה היא דרך מצוינת להוסיף ריאליזם לסביבה באמצעות אלמנטים של חזית ושל חזית אמצעית שמשתלבים בקופסת השמיים באמצעות אפקט הפרלקס.
בהנחיות לעיצוב של סביבות מרחביות תוכלו לקרוא על הסוגים השונים של נכסים שאפשר להשתמש בהם כדי ליצור סביבות מרחביות, ועל הדרכים ליצור סביבות מרחביות בטוחות ומהנות.
אתם יכולים להגדיר את הסביבה המרחבית של האפליקציה לאחת משלוש ההגדרות הבאות:
- שילוב של תמונה של תיבת שמיים וגיאומטריה של glTF.
- משטח שדרכו רואים את הסביבה, כאשר הסביבה המוצגת היא פיד בשידור חי מהמצלמות החיצוניות של המכשיר. כשהעובי של פני השטח של העברת ההמשך מלא, הוא מסתיר לחלוטין את תיבת השמיים ואת הגיאומטריה.
- הגדרה משולבת, שבה פני השטח של העברת הערך לא שקופפים לגמרי, אבל גם לא אטומים. במקרה כזה, המשטח של העברת ההעברה הופך למחצית שקוף והאלפא מתמזג עם תיבת השמיים והגיאומטריה שמאחוריו.
יכולות מרחביות לסביבות מרחביות
SpatialCapabilities
: מייצג את היכולות המרחביות של הסשן הנוכחי. יכולות מרחביות מסוימות רלוונטיות לסביבות מרחביות.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
: מציין אם הפעילות יכולה להפעיל או להשבית את העברת הנתונים (passthrough) בשלב הזה.SPATIAL_CAPABILITY_APP_ENVIRONMENT
: מציין אם הפעילות יכולה להגדיר סביבה מרחבית משלה בזמן הנוכחי או לא.
ייבוא וטעינה של משאבים של סביבה מרחבית
משאבי glTF ו-EXR לסביבות מרחביות נטענים באופן אסינכרוני באמצעות הכיתה Session
.
יצירת משאב glTF
אפשר ליצור משאב glTF בתור GltfModel
, שבו קובץ ה-glTF נטען מקובץ מקומי. אפשר להשתמש ב-GltfModel
כחלק מסביבת אפליקציה מרחבית.
val environmentGeometryFuture = GltfModel.create(session, "DayGeometry.glb") val environmentGeometry = environmentGeometryFuture.await()
יצירת משאב תמונה מסוג EXR
אפשר ליצור משאב תמונה מסוג EXR בתור ExrImage
, כאשר קובץ ה-EXR נטען מקובץ מקומי. אפשר להשתמש ב-ExrImage
עם cmgen כדי ליצור קובץ ZIP של ה-IBL לקופסאות השמיים. לפרטים נוספים, אפשר לעיין במדריך שלנו לאופטימיזציה של נכסי הסביבה.
val lightingForSkybox = ExrImage.create(session, "BlueSkyboxLighting.zip")
הגדרת SpatialEnvironmentPreference לאפליקציה
ה-method setSpatialEnvironmentPreference
משמש להגדרת הסביבה המרחבית המועדפת לאפליקציה. השיטה הזו מגדירה רק העדפה ולא גורמת לשינוי מיידי, אלא אם הערך של isSpatialEnvironmentPreferenceActive
כבר נכון. כשהמכשיר נכנס למצב שבו אפשר לשנות את הרקע ב-XR והיכולת SpatialCapabilities.SPATIAL_CAPABILITY_APP_ENVIRONMENT
זמינה, הסביבה המרחבית המועדפת לאפליקציה תוצג באופן אוטומטי.
הגדרת ההעדפה כ-null תשבית את הסביבה המרחבית המועדפת לאפליקציה, כלומר סביבת המערכת שמוגדרת כברירת מחדל תוצג במקום זאת.
אם הערך של SpatialEnvironmentPreference
לא null, אבל כל המאפיינים שלו הם null, הסביבה המרחבית תכלול רק קוביית שמיים שחורה ללא גיאומטריה.
כדי לקבל התראות על שינויים במצב של SpatialEnvironment, משתמשים בפקודה addOnSpatialEnvironmentChangedListener
.
שימוש בסיסי
קטע הקוד הזה יוצר את הגיאומטריה של הסביבה ואת משאבי ה-skybox, ואז מגדיר את ההעדפה של הסביבה המרחבית. ההעדפה הזו תישמר ותחול כשהאפליקציה תהיה מסוגלת להגדיר את הסביבה שלה.
val spatialEnvironmentPreference = SpatialEnvironment.SpatialEnvironmentPreference(lightingForSkybox, environmentGeometry) val preferenceResult = session.scene.spatialEnvironment.setSpatialEnvironmentPreference(spatialEnvironmentPreference) if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangeApplied()) { // The environment was successfully updated and is now visible, and any listeners // specified using addOnSpatialEnvironmentChangedListener will be notified. } else if (preferenceResult == SpatialEnvironment.SetSpatialEnvironmentPreferenceChangePending()) { // The environment is in the process of being updated. Once visible, any listeners // specified using addOnSpatialEnvironmentChangedListener will be notified. }
שימוש מתקדם
בתרחישי שימוש מתקדמים יותר שבהם אתם צריכים שליטה מדויקת יותר בסביבה, תוכלו לשלב בדיקות של SpatialCapabilities
ולהטמיע את addOnSpatialEnvironmentChangedListener
כדי לקבוע מתי אתם רוצים להגדיר את ההעדפה לסביבה המרחבית.
הגדרת PassthroughOpacityPreference לסביבה המרחבית של האפליקציה
אחד מהרכיבים של הרקע הווירטואלי העשיר של האפליקציה הוא משטח העברה (passthrough). במקרה כזה, הרקע שמוצג הוא פיד בשידור חי מהמצלמות של המכשיר שמכוונות החוצה.
setPassthroughOpacityPreference
משמש להגדרת השקיפות המועדפת של העברה (passthrough) לאפליקציה. השיטה הזו מגדירה רק העדפה ולא גורמת לשינוי מיידי, אלא אם היכולת SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
זמינה. כשהמכשיר נכנס למצב שבו אפשר לשנות את השקיפות של העברת הנתונים, והיכולת SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL
זמינה, השקיפות המועדפת של העברת הנתונים באפליקציה תחול באופן אוטומטי.
הערכים של העדפת השקיפות של העברה עוברים מ-0.0f
(אפס שקיפות, כאשר משטח העברה לא גלוי) ל-1.0f
(שקיפות מלאה, כאשר משטח העברה מסתיר את הסביבה המרחבית). הפרמטר setPassthroughOpacityPreference
הוא מספר ממשי שאפשר להגדיר לו ערך null. הגדרת הערך ל-null מציינת שאין לאפליקציה העדפה לשקיפות של העברה, והיא תחזיר את השליטה בהעברה למערכת.
שימוש בסיסי
קטע הקוד הזה מגדיר את העדפת השקיפות של העברת הנתונים. ההעדפה הזו תישמר ותחול כשהאפליקציה תהיה מסוגלת להגדיר את השקיפות של התצוגה השקופה.
val preferenceResult = session.scene.spatialEnvironment.setPassthroughOpacityPreference(1.0f) if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangeApplied()) { // The passthrough opacity request succeeded and should be visible now, and any listeners // specified using addOnPassthroughOpacityChangedListener will be notified } else if (preferenceResult == SpatialEnvironment.SetPassthroughOpacityPreferenceChangePending()) { // The passthrough opacity preference was successfully set, but not // immediately visible. The passthrough opacity change will be applied // when the activity has the // SpatialCapabilities.SPATIAL_CAPABILITY_PASSTHROUGH_CONTROL capability. // Then, any listeners specified using addOnPassthroughOpacityChangedListener // will be notified }
שימוש מתקדם
בתרחישי שימוש מתקדמים יותר שבהם אתם צריכים שליטה מדויקת יותר על השקיפות של העברת הנתונים, תוכלו לשלב בדיקות של SpatialCapabilities
ולהוסיף מאזין באמצעות addOnPassthroughOpacityChangedListener
כדי לקבוע מתי להגדיר את ההעדפה של שקיפות העברת הנתונים.
אופטימיזציה של נכסים
כשיוצרים נכסים להגדרת SpatialEnvironment
של המשתמשים, חשוב לוודא שהנכסים יהיו ברזולוציה גבוהה תוך שמירה על גודל קובץ סביר. מידע נוסף זמין בהנחיות שלנו לאופטימיזציה של נכסי סביבה.
קביעת השקיפות הנוכחית של העברת הנתונים
val currentPassthroughOpacity = session.scene.spatialEnvironment.getCurrentPassthroughOpacity()