סקירה כללית של הפעלת אנימציה באפליקציה שלך

הגדרת ה-build

הגדרת ה-build כדי לאפשר אנימציה באפליקציה שלך כוללת שינוי של הקובץ build.gradle וייבוא האנימציות לפרויקט שלך.

  1. מעדכנים את ה-app's build.gradle כדי לתמוך במודל אנימציה שמיובא להצגה. לשם כך, מוסיפים את תלות האנימציה ב-Sformum:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. ייבוא ותצוגה מקדימה של *.fbx קובצי אנימציה כדי לקבל קובץ *.sfb המכיל את המודל המיובא.

שימוש באנימציות בזמן ריצה

שימוש בפעולות בזמן ריצה כדי:

יצירת אנימציה ניתנת לעיבוד

בזמן ריצה, השתמש ב-ModelRenderable.Builder כדי לטעון את ה-*.sfb ולצרף אותו לצומת בסביבה, בדיוק כמו עם כל ModelRenderable:

  // Create the ModelRenderable.
  ModelRenderable.builder()
      .setSource(this, R.raw.andy)
      .build()
      .thenAccept(renderable -> andyRenderable = renderable)
      .exceptionally(
          throwable -> {
          Log.e(TAG, "Unable to load Renderable.", throwable);
          return null;
      });

  // Attach the ModelRenderable to the node in the scene.
  Node andyNode = new Node();
  andyNode.setParent(arFragment.getArSceneView().getScene());
  andyNode.setRenderable(andyRenderable);

גישה לנתוני האנימציה

// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");

גישה לאנימציות על סמך מטא-נתונים שונים

     // Get the animation name.
     danceData.getName();

כדי לאחזר מופע של נתוני אנימציה, משתמשים בשיטות ModelRenderable.getAnimationData():

     // Access animations by index.
     numAnimations = andyRenderable.getAnimationDataCount();
     danceData = andyRenderable.getAnimationData(0);

שליטה בהפעלה

יוצרים ModelAnimator כדי לשלוט בהפעלה.

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

יש להשתמש במדיניות start() כדי להפעיל את האנימציה. ההורדה תיפסק באופן אוטומטי בסוף.

andyAnimator.start();

כדי להציג את האנימציה בלופ, יש להשתמש ב-setRepeatCount()

andyAnimator.setRepeatCount(<number of repeats>)

(אופציונלי) הוספת פעולות אנימציה של נכסים

ModelAnimator מרחיב את הכיתה Animator ל-Android, שמאפשרת יותר אינטראקציות עשירות כמו loop, תגובה לאירועים ואינטרפולרים לא לינאריים.

שימוש ב-SkeletonNode לזיהוי וצירוף מודלים לעצמות

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

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

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

גישה למידע על עצמות

כדי לגשת למידע על עצמות ב-ModelRenderable, השתמשו בשיטות getBoneCount(), getBoneName() או getBoneParent():

// Get the number of bones in the model’s skeleton.
andyRenderable.getBoneCount();

// Get the names of the bones in the model’s skeleton.
andyRenderable.getBoneName();

// Get the hierarchy of the bones in the model’s skeleton.
andyRenderable.getBoneParent();

עובדים עם SkeletonNode

הכיתה SkeletonNode חושפת שלד של מודל כדי לחבר צמתים עצמות.

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

 andyWithSkeleton = new SkeletonNode();
 andyWithSkeleton.setRenderable(andyRenderable);
 andyWithSkeleton.setParent(scene);

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

 hatNode = new Node();
 Node boneNode = new Node();
 boneNode.setParent(andy);
 andy.setBoneAttachment(HAT_BONE_NAME, boneNode);
 hatNode.setRenderable(hatRenderable);
 hatNode.setParent(boneNode);
 hatNode.setWorldScale(Vector3.one());
 hatNode.setWorldRotation(Quaternion.identity());
 Vector3 pos = hatNode.getWorldPosition();