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

מכשירי XR רלוונטיים
ההנחיות האלה יעזרו לכם ליצור חוויות למכשירי XR מהסוגים האלה.
משקפי XR
משקפי AR חוטיים

כשעובדים עם מודלים תלת-ממדיים, ערכת Jetpack XR SDK תומכת בתקן הפתוח glTF 2.0. כשמערכת Android XR מעבדת אפליקציות שנבנו באמצעות Jetpack XR SDK, מודלים תלת-ממדיים יעובדו באמצעות טכניקות עיבוד פיזיקלי(PBR) שצוינו בתקן glTF 2.0 (יחד עם תוספים נתמכים). ברוב הכלים ליצירת תוכן דיגיטלי (DCC), כמו Autodesk Maya,‏ Maxon ZBrush,‏ Blender ו-Spline, אפשר לייצא מודלים תלת-ממדיים בפורמט glTF (קבצים מסוג .gltf או .glb).

אם המשתמש או האפליקציה שלכם ציינו SpatialEnvironment skybox של סביבה, מודלים תלת-ממדיים יוארו באמצעות נתוני תאורה שסופקו על ידי ה-skybox של הסביבה. חומרים מחזירי אור והדגשות ספקולריות ישקפו גם את תיבת השמיים של הסביבה. אם הפעלתם את ההגדרה 'העברה', התאורה, ההשתקפויות וההדגשות יתבססו על חדר פשוט ומואר עם מקור אור יחיד.

סקירה כללית של החומרים הנתמכים מופיעה במאמר glTF PBR Properties באתר Khronos.

יש שתי דרכים עיקריות לטעון מודלים תלת-ממדיים באפליקציות שפותחו באמצעות Jetpack XR SDK.

מיקום של מודל תלת-ממדי ב-ActivitySpace

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

דוגמה להוספת נכסים לספרייה ‎ /models

כדי לטעון את מודל ה-glTF, קוראים לפונקציה GltfModel.create().

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

בשלב הזה, המודל נטען לזיכרון, אבל הוא עדיין לא מוצג. אם יש לכם הרבה מודלים בתלת-ממד לטעון או שהמודל גדול, מומלץ לטעון אותם באופן אסינכרוני מראש. כך המשתמשים לא צריכים לחכות שהמודלים ייטענו לזיכרון.

צריך להוסיף את קובץ ה-glTF אל ActivitySpace. מבצעים קריאה ל-method‏ GltfModelEntity.create כדי ליצור ישות ולהציב אותה ב-ActivitySpace. השיטה המומלצת היא לוודא שהאפליקציה במצב שמאפשר יכולות מרחביות.

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

עכשיו, כשמריצים את האפליקציה, אמור להופיע הדגם התלת-ממדי שנטען.

דוגמה למודל תלת-ממדי שנטען

הצבת מודל תלת-ממדי ב-Compose SceneCoreEntity

עדיין תצטרכו לטעון את קובץ ה-glTF לזיכרון באמצעות GltfModel.create(), אבל אם אתם יוצרים את ממשק המשתמש באמצעות Jetpack Compose ל-XR, תוכלו למקם מודלים תלת-ממדיים ב-SceneCoreEntity. פרטים נוספים מופיעים במאמר בנושא שימוש ב-SceneCoreEntity כדי למקם אובייקט תלת-ממדי בפריסה.

הנפשת מודלים תלת-ממדיים

כחלק ממפרט glTF, אפשר להטמיע אנימציות במודלים תלת-ממדיים. כל האנימציות הבאות נתמכות ב-Jetpack XR SDK: אנימציות של שלד (rigged), אנימציות קשיחות ואנימציות של יעד מורף (צורות מיזוג). יש תמיכה גם באנימציות של חומרים שנוצרו באמצעות KHR_animation_pointer התוסף glTF.

כדי להפעיל אנימציה, קוראים לפונקציה startAnimation() ומציינים את שם האנימציה. אפשר גם לציין אם האנימציה צריכה לחזור על עצמה ללא הפסקה.

gltfEntity.startAnimation(loop = true, animationName = "Walk")

אם מתקשרים אל startAnimation בפעם השנייה, האנימציה הנוכחית תיפסק והאנימציה החדשה תתחיל.

אפשר לשלוח שאילתה לגבי המצב הנוכחי של האנימציה באמצעות getAnimationState().

אם שם האנימציה שצוין כשקוראים ל-startAnimation() לא קיים, הקריאה נכשלת בשקט, כל האנימציות שפועלות נעצרות ו-getAnimationState() מחזירה STOPPED.

טעינת מודל תלת-ממד באמצעות Scene Viewer

אם אתם מחפשים את הדרך הפשוטה ביותר לטעון מודל תלת-ממד עם יכולות בסיסיות של אינטראקציה, אתם יכולים להשתמש ב-Scene Viewer כמו שהייתם עושים בנייד. ההבדל העיקרי בין Scene Viewer ב-Android XR לבין Scene Viewer בנייד הוא שב-Scene Viewer יש תמיכה רק בפרמטר file URI שמפנה לקובץ glTF, וכל הפרמטרים האחרים מוזנחים.

Scene Viewer היא אפליקציה נפרדת שמופעלת באמצעות intent ופועלת במצב Full Space. כתוצאה מכך, כשתפעילו אותו, האפליקציה לא תהיה יותר גלויה ו-Scene Viewer יקבל את הפוקוס. כל הסביבות ששיניתם יאופסו להעדפות המערכת של המשתמש.

דוגמה לשימוש ב-Intent כדי להציג קובץ glTF ב-Scene Viewer ב-Android XR:

val url =
    "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
    Uri.parse("https://arvr.google.com/scene-viewer/1.2")
        .buildUpon()
        .appendQueryParameter("file", url)
        .build()
sceneViewerIntent.setData(intentUri)
try {
    startActivity(sceneViewerIntent)
} catch (e: ActivityNotFoundException) {
    // There is no activity that could handle the intent.
}

מידע נוסף על אפשרויות האינטראקטיביות ב-Scene Viewer זמין במסמכי התיעוד בנושא עיצוב מודלים תלת-ממדיים.

תוספי glTF

‫Jetpack XR SDK תומך בכמה תוספי gfTF שמרחיבים את היכולות של מודלים תלת-ממדיים. היכולות האלה זמינות גם דרך GltfModelEntity וגם דרך Scene Viewer.