Ringkasan cara mengaktifkan animasi di aplikasi Anda

Mengonfigurasi build

Mengonfigurasi build untuk mengaktifkan animasi di aplikasi Anda melibatkan modifikasi file build.gradle dan pengimporan animasi ke project Anda.

  1. Update build.gradle aplikasi Anda untuk mendukung model animasi yang diimpor yang dapat dirender, dengan menambahkan dependensi animasi Sceneform:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. Impor dan pratinjau file animasi *.fbx untuk mendapatkan file *.sfb yang berisi model yang diimpor.

Menggunakan animasi pada waktu proses

Gunakan operasi runtime untuk:

Membuat animasi yang dapat dirender

Saat waktu proses, gunakan ModelRenderable.Builder untuk memuat *.sfb dan melampirkannya ke node dalam scene, seperti yang akan Anda lakukan dengan ModelRenderable mana pun:

  // 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);

Mendapatkan akses ke data animasi

// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");

Mengakses animasi berdasarkan metadata yang berbeda

     // Get the animation name.
     danceData.getName();

Untuk mengambil instance data animasi, gunakan metode ModelRenderable.getAnimationData():

     // Access animations by index.
     numAnimations = andyRenderable.getAnimationDataCount();
     danceData = andyRenderable.getAnimationData(0);

Mengontrol pemutaran

Buat ModelAnimator untuk mengontrol pemutaran.

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

Gunakan start() untuk memutar animasi. Fitur ini akan otomatis berhenti di akhir.

andyAnimator.start();

Untuk mengulangi animasi, gunakan setRepeatCount()

andyAnimator.setRepeatCount(<number of repeats>)

(Opsional) Menambahkan operasi animasi properti

ModelAnimator memperluas class Animator Android, yang memungkinkan interaksi yang lebih kaya seperti loop, yang merespons peristiwa, dan interpolator non-linear.

Menggunakan SkeletonNode untuk mengidentifikasi dan melampirkan model ke tulang

Saat Anda menangani render yang berisi tulang, gunakan class SkeletonNode untuk mendapatkan akses ke setiap tulang dalam kerangka dengan melampirkan node ke tulang. Hal ini memungkinkan Anda "melampirkan" objek ke tulang atau mengontrol posisinya.

Saat animasi diputar, Posisi, skala, dan orientasi node yang terpasang akan diperbarui oleh SkeletonNode setiap frame. Menetapkan posisi, skala, atau rotasi node yang terpasang akan mengganti tulang hingga kali berikutnya tulang diupdate oleh animasi.

Dalam contoh Animasi, hal ini dilakukan dengan melampirkan Node yang berisi model topi ke tulang untuk “kepala” Andy. Saat Andy dianimasikan, topi tetap berada di kepalanya.

Mengakses informasi tentang tulang

Untuk mengakses informasi tentang tulang di ModelRenderable, gunakan metode getBoneCount(), getBoneName(), atau 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();

Bekerja dengan SkeletonNode

Class SkeletonNode menampilkan framework model untuk melampirkan node ke tulang tertentu.

Untuk menggunakan SkeletonNode, buat pembuatan instance baru dan tetapkan render ke render yang berisi model dengan kerangka.

 andyWithSkeleton = new SkeletonNode();
 andyWithSkeleton.setRenderable(andyRenderable);
 andyWithSkeleton.setParent(scene);

Untuk melampirkan render ke tulang tertentu, pertama-tama buat node baru dan kaitkan ke tulang. Tambahkan node yang dapat dirender sebagai turunan node pertama. Untuk memastikan bahwa skala dan rotasi tulang tidak digunakan untuk menyetel transformasi relatif node, pastikan untuk mereset skala dan posisi node kedua.

 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();