Bagaimana secara dinamis menghidupkan bagian dari model 3d menuju sesuatu


8

Saya ingin tahu tentang bagaimana animasi semacam ini biasanya dilakukan dengan bijaksana.

Beberapa contoh:

Jawaban:


4

Ini disebut kinematika terbalik. Google mungkin adalah teman terbaik Anda karena ini dapat menjadi kompleks.


Saya mengerti, saya harus menghitung gerakan yang diperlukan untuk mencapai posisi yang diinginkan. Dalam hal ini, saya hanya akan menghitung gerakan untuk tulang yang diinginkan.
Gerstmann

Memang, deskripsi video mengatakan "... sistem animasi yang sepenuhnya didasarkan pada kinematika terbalik ..."
MichaelHouse

0

Artikel Asli: Cara Membuat Kode Sistem IK

Terkadang IK yang dibangun ke dalam Unity tidak cukup. Saya akan menunjukkan kepada Anda bagaimana membangun skrip IK Anda sendiri untuk Unity. Anda dapat menerapkan IK ini untuk semua benda yang diartikulasikan - jari, tangan, atau kaki. IK yang akan saya ulas saat ini digunakan oleh Unity, Unreal, Panda, dan beberapa mesin game lainnya. Itu disebut FABRIK.

FABRIK adalah metode berulang. Metode berulang adalah metode yang tidak langsung mendapatkan solusinya. Metode iteratif semakin dekat dan lebih dekat ke solusi yang benar dengan lebih banyak iterasi dari metode - dengan kata lain, iterasi loop.

Setiap masalah IK memiliki tubuh artikulasi yang diberikan (satu set anggota badan yang terhubung dengan panjang dan sudut). End effector (posisi titik akhir tungkai akhir) memiliki posisi awal dengan posisi tujuan. Mungkin ada tujuan lain, seperti sudut.

Setiap iterasi FABRIK memiliki dua bagian utama.

void FABRIK() {
    while( abs(endEffectorPosition  goalPosition) > EPS ) {
        FinalToRoot(); // PartOne
        RootToFinal(); // PartTwo
    }
}

Bagian pertama beralih dari tungkai terakhir ke tungkai akar. Untuk tungkai akhir, Anda perlu mengubah sudut / rotasi tungkai untuk menunjuk pada posisi tujuan (menjaga posisi inboard berlabuh, dan membiarkan posisi tempel diterjemahkan oleh perubahan sudut). Selanjutnya, Anda menerjemahkan ekstremitas akhir di sepanjang sudut yang diperbarui menuju posisi tujuan, sampai posisi tempel ekstrem sama dengan posisi tujuan (mempertahankan sudut, tetapi membiarkan posisi inboard ekstremitas berubah). Cukup banyak untuk tungkai terakhir, kecuali Anda sekarang perlu memperbarui posisi tujuan saat ini. Posisi tujuan saat ini sekarang disetel ke posisi inboard yang diperbarui dari ekstremitas akhir.

Untuk setiap anggota tubuh berturut-turut, Anda melakukan hal yang sama. Agar jelas saya akan menguraikannya. Untuk tungkai saat ini, Anda perlu mengubah sudut / rotasi tungkai untuk menunjuk ke posisi tujuan saat ini. Selanjutnya, Anda menerjemahkan ekstremitas saat ini di sepanjang sudut yang diperbarui menuju posisi tujuan saat ini, sampai posisi tempel ekstrem sama dengan posisi sasaran saat ini. Akhirnya, Anda memperbarui posisi sasaran saat ini menjadi sama dengan posisi inboard diperbarui dari anggota tubuh saat ini.

Ulangi operasi ini sampai Anda menyelesaikan operasi ini di root tungkai. Setelah itu, bagian pertama selesai.

/* Part One */
void FinalToRoot() {
    currentGoal = goalPosition;
    currentLimb = finalLimb;
    while (currentLimb != NULL) {
        currentLimb.rotation = RotFromTo(Vector.UP,
            currentGoal  currentLimb.inboardPosition);
        currentGoal = currentLimb.inboardPosition;
        currentLimb = currentLimb->inboardLimb;
    }
}

Bagian kedua beralih ke arah sebaliknya: dari tungkai akar ke tungkai akhir. Untuk ekstremitas root, Anda perlu memperbarui posisi inboard ke posisi root. Ini harus menerjemahkan seluruh anggota badan (tanpa peregangan). Cukup banyak untuk root, kecuali sekarang Anda perlu memperbarui posisi inboard saat ini. Posisi inboard saat ini sekarang diatur ke posisi outboard ekstremitas yang diperbarui. Untuk setiap ekstremitas tempel berturut-turut, Anda melakukan hal yang sama. Agar jelas saya akan menguraikannya. Untuk ekstremitas saat ini, Anda perlu memperbarui posisi inboard ke posisi inboard saat ini. Ini harus menerjemahkan seluruh anggota badan. Cukup banyak untuk ekstremitas saat ini, kecuali Anda sekarang perlu memperbarui posisi inboard saat ini. Posisi inboard saat ini sekarang diatur ke posisi outboard yang diperbarui dari ekstremitas saat ini.

Ulangi operasi ini sampai Anda menyelesaikan operasi ini pada ekstremitas akhir. Setelah itu, bagian kedua selesai.

/* Part Two */
void RootToFinal() {
    currentInboardPosition = rootLimb.inboardPosition;
    currentLimb = rootLimb;
    while (currentLimb != NULL) {
        currentLimb.inboardPosition = currentInboardPosition;
        currentInboardPosition = currentLimb.outboardPosition;
        currentLimb = currentLimb->inboardLimb;
    }
}

Setelah bagian pertama dan kedua selesai, Anda telah menyelesaikan iterasi pertama metode FABRIK. Lanjutkan iterasi pada bagian satu dan dua hingga efektor akhir sedekat yang Anda butuhkan dengan posisi tujuan, yang ditentukan oleh beberapa EPS (nilai epsilon).

Itu dia! Itulah metode FABRIK. Bagian Satu beralih mundur dari anggota badan terakhir. Bagian Dua bergerak maju dari tungkai akar. Metode FABRIK mengulangi Bagian Satu dan Bagian Dua sampai efektor akhir cukup dekat dengan posisi tujuan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.