ضبط الإصدار
يتضمّن ضبط الإصدار لتفعيل الصور المتحركة في تطبيقك تعديل
ملف build.gradle
واستيراد الصور المتحركة إلى مشروعك.
عدِّل app's
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
فئة Animator
في Android، ما يسمح بتفاعلات أكثر ثراءً، مثل تكرار والرد على الأحداث واستقصاءات غير خطية.
استخدام 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();