نظرة عامة على تفعيل الصور المتحركة في تطبيقك

ضبط الإصدار

يتضمّن ضبط الإصدار لتفعيل الصور المتحركة في تطبيقك تعديل ملف build.gradle واستيراد الصور المتحركة إلى مشروعك.

  1. عدِّل app's build.gradle لإتاحة نموذج متحرك قابل للعرض، من خلال إضافة اعتمادية الصورة المتحركة:

     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، ما يسمح بتفاعلات أكثر ثراءً، مثل تكرار والرد على الأحداث واستقصاءات غير خطية.

استخدام 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();