Mengonfigurasi build
Mengonfigurasi build untuk mengaktifkan animasi di aplikasi Anda melibatkan modifikasi
file build.gradle
dan pengimporan animasi ke project Anda.
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" }
Impor dan pratinjau file animasi
*.fbx
untuk mendapatkan file*.sfb
yang berisi model yang diimpor.
Menggunakan animasi pada waktu proses
Gunakan operasi runtime untuk:
(Opsional) Tambahkan animasi properti tambahan
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();