כשעובדים עם מודלים תלת-ממדיים, ערכת ה-SDK של Jetpack XR תומכת בתקן הפתוח glTF 2.0. כשמערכת Android XR מבצעת עיבוד גרפי של אפליקציות שנוצרו באמצעות Jetpack XR SDK, מודלים תלת-ממדיים עוברים עיבוד באמצעות שיטות של עיבוד גרפי מבוסס-פיזיקה(PBR) שצוינו בתקן glTF 2.0 (יחד עם extensions
נתמכים). רוב הכלים ליצירת תוכן דיגיטלי (dcc), כמו Autodesk Maya, Maxon ZBrush, Blender ו-Spline, יכולים לייצא מודלים תלת-ממדיים לפורמט glTF (קבצים מסוג .gltf
או .glb
).
אם המשתמש או האפליקציה ציינו קובץ skybox מסוג SpatialEnvironment
, מודלים תלת-ממדיים יוארו באמצעות נתוני התאורה שסופקו על ידי קובץ skybox הסביבה. גם חומרים עם השתקפות והשתקפויות specular ישקפו את תיבת השמיים של הסביבה. אם התכונה Passthrough מופעלת, התאורה, ההשתקפויות וההבלטה של פני השטח (specular highlights) יתבססו על חדר פשוט ובהיר עם תאורה כיוונית אחת.
סקירה כללית מהירה של החומרים הנתמכים מופיעה במאמר glTF PBR Properties באתר של Khronos.
יש שתי דרכים עיקריות לטעון מודלים תלת-ממדיים באפליקציות שנוצרו באמצעות Jetpack XR SDK.
- מעלים אותו ל-
ActivitySpace
כפי שמתואר בקטע הבא, הוספת מודל תלת-ממדי למרחב הפעילות - שימוש בתצוגת הווידאו המובנית באמצעות כוונת רכישה
הצבת מודל תלת-ממדי במרחב הפעילות
אחרי שתיצרו את קובץ ה-glTF, תצטרכו להוסיף אותו לספריית הנכסים ב-Android Studio. מומלץ ליצור ספרייה models
כדי לארגן טוב יותר את סוגי הנכסים.
כדי לטעון את מודל ה-glTF, קוראים ל-createGltfResourceAsync
.
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
בשלב הזה, המודל נטען בזיכרון אבל עדיין לא מתבצע רינדור שלו. אם אתם צריכים לטעון הרבה מודלים תלת-ממדיים או שהמודל גדול, מומלץ לטעון אותם באופן אסינכרוני מראש. כך המשתמשים לא יצטרכו להמתין לטעינת המודלים בזיכרון.
אנחנו צריכים להוסיף את קובץ ה-glTF ל-ActivitySpace
. קוראים ל-createGltfEntity
כדי ליצור ישות ולהוסיף אותה ל-ActivitySpace
. מומלץ לבדוק שהאפליקציה נמצאת במצב שמאפשר להשתמש ביכולות המרחביות.
// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
// create the gltf entity using the gltf file from the previous snippet
val gltfEntity = xrSession.createGltfEntity(gltfModel)
}
עכשיו הדגם התלת-ממדי טעון, ואמור להופיע כשמריצים את האפליקציה.
הצבת מודל תלת-ממדי בנפח של Compose
עדיין תצטרכו לטעון את קובץ ה-glTF לזיכרון באמצעות createGltfResourceAsync
, אבל אם אתם יוצרים את ממשק המשתמש באמצעות Jetpack Compose for XR, תוכלו להציב מודלים תלת-ממדיים ב-Volume
. אפשר לעיין במאמר שימוש בנפח כדי למקם אובייקט תלת-ממדי בפריסה.
אנימציה של מודלים תלת-ממדיים
כחלק מפרט glTF, אפשר להטמיע אנימציות במודלים תלת-ממדיים.
ב-Jetpack XR SDK יש תמיכה בכל סוגי האנימציות: שלד (ריג), נוקשה, יעד טרנספורמציה (צורות מיזוג). יש גם תמיכה באנימציות של חומרים שנוצרו באמצעות התוסף KHR_animation_pointer
ל-glTF.
כדי להפעיל אנימציה, צריך להפעיל את הפונקציה startAnimation
ולציין את שם האנימציה. אפשר לציין אם האנימציה תופעל בלופ ללא הגבלת זמן או לא.
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
אם תפעילו את startAnimation
בפעם השנייה, האנימציה הנוכחית תפסיק והאנימציה החדשה תתחיל.
אפשר לשלוח שאילתה לגבי המצב הנוכחי של האנימציה באמצעות getAnimationState()
.
אם שם האנימציה שצוין בקריאה ל-startAnimation()
לא קיים, הקריאה תיכשל ללא הודעה, כל האנימציות שפועלות יפסיקו לפעול ו-getAnimationState()
יחזיר את הערך STOPPED
.
טעינת מודל תלת-ממד באמצעות Scene Viewer
אם אתם מחפשים את הדרך הפשוטה ביותר לטעון מודל תלת-ממד עם יכולות אינטראקציה בסיסיות, תוכלו להשתמש ב-Scene Viewer כמו שאתם עושים בנייד. ההבדל העיקרי בין Scene Viewer ב-Android XR לבין Scene Viewer בנייד הוא ש-Scene Viewer תומך רק בפרמטר URI של הקובץ שמצביע על קובץ ה-glTF, וכל שאר הפרמטרים מתעלמים.
'תצוגת סצנות' היא אפליקציה נפרדת שמופעל באמצעות כוונה (intent) ופועלת במצב מלא. כתוצאה מכך, כשתפעילו אותו, האפליקציה שלכם לא תהיה גלויה יותר והתמקדות תהיה ב-Scene Viewer. כל סביבות ששיניתם יוחזרו להעדפות המערכת של המשתמש.
דוגמה לשימוש ב-Intent
כדי להציג קובץ glTF ב-Scene Viewer ב-Android XR:
val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
Uri.parse("https://arvr.google.com/scene-viewer/1.2")
.buildUpon()
.appendQueryParameter("file", THREED_MODEL_URL)
.build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)
מידע נוסף על אפשרויות האינטראקטיביות של 'תצוגת סצנה' זמין במסמכי העזרה בנושא עיצוב מודלים תלת-ממדיים.
תוספי glTF
Jetpack XR SDK תומך בכמה תוספים של gfTF שמרחיבים את היכולות של מודלים תלת-ממדיים. היכולות האלה זמינות גם דרך GltfEntity
וגם דרך 'תצוגת סצנה'.
KHR_animation_pointer
KHR_draco_mesh_compression
KHR_lights_punctual
KHR_materials_clearcoat
KHR_materials_sheen
KHR_materials_unlit
KHR_materials_variants
KHR_mesh_quantization
KHR_texture_basisu
KHR_texture_transform
EXT_texture_webp