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

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

כשעובדים עם מודלים תלת-ממדיים, ערכת 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, המודלים התלת-ממדיים יוארו באמצעות מידע על התאורה שסופק על ידי תיבת השמיים של הסביבה. חומרים מחזירי אור והדגשות ספקולריות ישקפו גם את תיבת השמיים של הסביבה. אם הפעלתם את מצב המעבר, התאורה, ההשתקפויות וההדגשות המבריקות יתבססו על חדר מואר עם אור כיווני אחד.

לסקירה כללית מהירה של החומרים הנתמכים, אפשר לעיין במאמר glTF PBR Properties באתר Khronos. במאמר התאמה אישית של מודלים תלת-ממדיים באפליקציה מוסבר איך להתאים אישית את המודלים התלת-ממדיים באמצעות המאפיינים האלה ומאפיינים אחרים.

הוספת קובץ glTF לתיקיית הנכסים

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

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

הוספת אובייקט תלת-ממדי באמצעות SpatialGltfModel

‫Android XR תומך בפורמט glTF למודלים תלת-ממדיים, שבדרך כלל נשמרים כקובצי .glb. כדי להוסיף את האובייקטים האלה לפריסה, משתמשים ב-SpatialGltfModel. ‫SpatialGltfModel הוא רכיב קומפוזבל של מרחב משנה שמאפשר להוסיף מודלים תלת-ממדיים בפורמט glTF לפריסה המרחבית. ה-API הזה מפשט את תהליך הטעינה של הנכסים ואת ניהול המצב שלהם.

כדי להציג מודל, קודם צריך להגדיר את המקור והמצב שלו באמצעות rememberSpatialGltfModelState. אפשר לטעון מודלים מהתיקייה assets של האפליקציה, מ-URI או מ-raw data.

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

אחרי שמגדירים את ערך דינמי, משתמשים בפונקציה הקומפוזבילית SpatialGltfModel כדי לרנדר אותו בתוך מרחב משנה:

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

מידע חשוב על הקוד

  • טעינה אסינכרונית: המודל נטען באופן אסינכרוני. במהלך הקומפוזיציה הראשונית, הגודל הפנימי שלו עשוי להיות אפס. הפריסה נמדדת מחדש כשהמודל מוכן.
  • שליטה במצב: משתמשים ב-SpatialGltfModelState.status כדי לשלוח שאילתה לגבי סטטוס הטעינה או כדי לשלוט באנימציות.
  • גודל וקנה מידה: כברירת מחדל, גודל הפריסה תואם לתיבה התוחמת של הנכס. אפשר לשנות את זה באמצעות SubspaceModifier.size כדי לשנות את קנה המידה של המודל באופן אחיד כך שיתאים לגבולות שצוינו.

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

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

הצבת מודל תלת-ממדי באמצעות Jetpack Scenecore

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

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

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

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

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

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

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

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

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

Scene Viewer היא אפליקציה נפרדת שמופעלת באמצעות Intent ופועלת במצב "מרחב מלא". כתוצאה מכך, כשתפעילו אותו, האפליקציה שלכם לא תהיה גלויה יותר והמיקוד יהיה ב-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 תומך בכמה תוספים של glTF שמרחיבים את היכולות של מודלים תלת-ממדיים. היכולות האלה זמינות גם דרך GltfModelEntity וגם דרך Scene Viewer.