יצירת רינדור

Renderable הוא מודל תלת-ממדי שמורכב מקודקודים, חומרים, מרקמים ועוד. ניתן לצרף את התמונה ל-Node ולעבד אותה כחלק מסצנה. בדף הזה נסביר איך ליצור ולשנות Renderable.

יצירה מהווידג'טים של Android

ניתן ליצור ViewRenderable ווידג'טים ל-Android רגילים. הם מעובדים ככרטיסים קבועים בסצנה.

כך יוצרים מודעה:

  1. יוצרים קובץ פריסה ב-res > פריסה. למשל:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/planetInfoCard"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:background="@drawable/rounded_bg"
       android:gravity="center"
       android:orientation="vertical"
       android:padding="6dp"
       android:text="Test"
       android:textAlignment="center" />
    
  2. יצירת ViewRenderable.

    ViewRenderable.builder()
        .setView(this, R.layout.test_view)
        .build()
        .thenAccept(renderable -> testViewRenderable = renderable);
    

    הגרסה הזו של setView() מקבלת את מזהה המשאב של קובץ הפריסה שאינו מנופח. אפשר גם להתקשר setView(View) כדי ליצור מודעות הניתנות לצפייה מתצוגות מפורטות שנוצרות באופן פרוגרמטי.

כל build() השיטות ב-Stform מחזירות CompletableFuture. האובייקט מובנה בשרשור נפרד, ופונקציית הקריאה החוזרת מופעלת בשרשור הראשי.

הגודל של פריטים שניתן לעבד מבוסס על גודל האובייקט של View. כברירת מחדל, כל 250dp עבור התצוגה הופכת למטר אחד לעיבוד. אפשר להשתמש setSizer(ViewSizer) כדי לשנות את אופן החישוב של גודל התצוגה.

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

// update button text when the renderable's node is tapped
Button button = (Button) renderable.getView();
button.setOnClickListener((button) -> button.setText("clicked"));

יצירה מנכס תלת-ממדי

schemaform מספקת כלים ויישומי פלאגין להמרת קבצים של נכסי תלת-ממד (OBJ, FBX, glTF) לנכסים בינאריים של schemaform (SFB). לאחר מכן, ניתן להשתמש בהם בפורמט ModelRenderable.

מידע נוסף זמין במאמר ייבוא ותצוגה מקדימה של נכסי תלת-ממד.

יצירת צורות פשוטות בזמן ריצה

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

כך יוצרים כדור אדום:

MaterialFactory.makeOpaqueWithColor(this, new Color(android.graphics.Color.RED))
        .thenAccept(
            material -> {
              redSphereRenderable =
                  ShapeFactory.makeSphere(0.1f, new Vector3(0.0f, 0.15f, 0.0f), material); });

טעינת מודלים תלת-ממדיים בזמן ריצה

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

כדי להשתמש בטעינת זמן ריצה, צריך להוסיף את התלות בספריית הנכסים ב-app/build.gradle:

  dependencies {
     implementation 'com.google.ar.sceneform:assets:1.15.0'
  }

מחלקה RenderableSource מטפלת בטעינת קובץ glTF וביצירת אובייקט מקור עבור ModelRenderable.Builder שיוצר את האובייקט הניתן לעיבוד.

לדוגמה, טעינת דגם מהאינטרנט נראית כך:

 private static final String GLTF_ASSET =
   "https://github.com/KhronosGroup/glTF-Sample-Models/raw/master/2.0/Duck/glTF/Duck.gltf";

 /* When you build a Renderable, Sceneform loads model and related resources
 * in the background while returning a CompletableFuture.
 * Call thenAccept(), handle(), or check isDone() before calling get().
 */
 ModelRenderable.builder()
    .setSource(this, RenderableSource.builder().setSource(
            this,
            Uri.parse(GLTF_ASSET),
            RenderableSource.SourceType.GLTF2)
            .setScale(0.5f)  // Scale the original model to 50%.
            .setRecenterMode(RenderableSource.RecenterMode.ROOT)
            .build())
    .setRegistryId(GLTF_ASSET)
    .build()
    .thenAccept(renderable -> duckRenderable = renderable)
    .exceptionally(
        throwable -> {
          Toast toast =
              Toast.makeText(this, "Unable to load renderable " +
              GLTF_ASSET, Toast.LENGTH_LONG);
          toast.setGravity(Gravity.CENTER, 0, 0);
          toast.show();
          return null;
        });

הערה: כדי לגשת למשאבים מרחוק, צריך לכלול את הרשאת האינטרנט ב-AndroidManifest.xml:

    <manifest …>
      <!-- Needed to load a glTF from the internet. -->
        <uses-permission android:name="android.permission.INTERNET"/>

    </manifest>

שינוי רכיבי הרינדור בזמן הריצה

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

blueSphereRenderable = redSphereRenderable.makeCopy();
blueSphereRenderable.getMaterial().setFloat3(
                  MaterialFactory.MATERIAL_COLOR, new Color(android.graphics.Color.BLUE));