הוספת מודלים תלת-ממדיים לאפליקציה

כשעובדים עם מודלים תלת-ממדיים, ערכת ה-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.

הצבת מודל תלת-ממדי במרחב הפעילות

אחרי שתיצרו את קובץ ה-glTF, תצטרכו להוסיף אותו לספריית הנכסים ב-Android Studio. מומלץ ליצור ספרייה models כדי לארגן טוב יותר את סוגי הנכסים.

דוגמה להוספת נכסים לספרייה ‎ /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 וגם דרך 'תצוגת סצנה'.