הגדרת ה-build
הגדרת ה-build כדי לאפשר אנימציה באפליקציה שלך כוללת שינוי של הקובץ build.gradle
וייבוא האנימציות לפרויקט שלך.
מעדכנים את ה-app's
build.gradle
כדי לתמוך במודל אנימציה שמיובא להצגה. לשם כך, מוסיפים את תלות האנימציה ב-Sformum:dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
ייבוא ותצוגה מקדימה של
*.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();