הגדרת ה-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();