پیکربندی ساخت
پیکربندی بیلد برای فعال کردن انیمیشن در برنامه شما شامل تغییر فایل build.gradle
و وارد کردن انیمیشن ها به پروژه شما است.
با افزودن وابستگی انیمیشن Sceneform،
build.gradle
برنامه خود را بهروزرسانی کنید تا از یک مدل انیمیشن وارداتی قابل رندر پشتیبانی کند: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
کلاس Android Animator
را گسترش میدهد، که امکان تعاملات غنیتری مانند حلقه زدن، پاسخ به رویدادها و درونیابیهای غیرخطی را فراهم میکند.
استفاده از 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
s
کلاس 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();