Skip to content

Saat animasi harus menyentuh dunia ​

Oleh Oleg Sidorkin, CTO dan Co-Founder Cinevva

Animasi berjalan mengetahui bagaimana kaki bergerak. Namun, animasi itu tidak mengetahui bahwa salah satu kaki telah mencapai anak tangga. Animasi menjangkau mengetahui bagaimana lengan bergerak. Namun, animasi itu tidak mengetahui letak lubang kunci tertentu ini, atau bahwa seseorang telah memindahkan cangkir.

Inilah masalah berikutnya setelah melakukan auto-rigging pada karakter: membuat animasi merespons adegan saat game sedang berjalan. Kami telah mengimplementasikan lapisan koreksi eksperimental dalam runtime Three.js Cinevva. Lapisan ini membaca pose yang dihasilkan animasi, memeriksa adegan, lalu menyesuaikan sendi karakter sebelum frame dirender.

Contoh-contoh di bawah ini menjalankan kode tersebut di browser Anda. Tidak ada permintaan pembuatan gerakan dalam loop per frame.

Coba lihat perbedaannya ​

Demo dimulai secara otomatis. Pilih contoh, lalu nonaktifkan dan aktifkan Koreksi. Karakter di sebelah kiri menampilkan pose dasar; karakter di sebelah kanan menerima koreksi langsung. Jeda dan seret linimasa untuk memeriksa momen tertentu. Seret salah satu viewport untuk mengorbit karakter, gulir atau cubit untuk memperbesar dan memperkecil, serta seret dengan tombol kanan untuk menggeser. Kedua kamera tetap tersinkronisasi sehingga Anda dapat memeriksa kontak yang sama dari sudut yang benar-benar sama.

Setiap contoh menggunakan katak hasil auto-rigging Cinevva yang sama. Contoh berjalan memutar Berjalan dari Universal Animation Library, yang di-retarget menggunakan kode yang sama dengan Auto Rigger. Kedua viewport memutar klip sebenarnya; viewport kanan menambahkan koreksi medan saat runtime. Contoh lain mempertahankan referensi Idle yang disematkan beserta pengontrol interaksinya.

Pengontrol berjalan merencanakan satu langkah ke depan. Pengontrol ini memprediksi pijakan bergerak saat kaki menyentuhnya, memusatkan seluruh telapak kaki katak di dalam area pendaratan, dan mengayunkan kaki yang akan melangkah melewati ketinggian anak tangga mendatang. Pengontrol mempertahankan irama dan bentuk ayunan klip pustaka sembari menyesuaikan panjang langkah. Pelvis memulai perpindahan beban dan perubahan ketinggian sebelum mendarat; IK kemudian menempatkan anggota gerak pada target yang direncanakan dan menyempurnakan kontak telapak kaki yang terlihat.

Aktifkan Rencana langkah kaki untuk melihat garis luar telapak kaki pada posisi perkiraan pendaratan dan jalur ayunan bergaris putus-putus. Jejak pelvis membandingkan gerakan tubuh, sedangkan Simpan jejak pelvis mempertahankan hasil pengukurannya. Perencana ini saat ini menangani pijakan bergeser yang telah diketahui dalam demo. Perencana melaporkan pendaratan yang tidak memungkinkan; navigasi medan arbitrer dan gaya keseimbangan fisik merupakan tanggung jawab engine yang terpisah.

Memanjat tangga memindahkan satu anggota gerak pada satu waktu sementara tiga kontak lainnya tetap berpegangan pada anak tangga. Tangga bergerak turun agar pemanjat tetap terlihat. Target pergelangan kaki dan tangan yang eksplisit menempatkan kontak, sedangkan panduan siku/lutut menjaga tekukan tidak membentur tangga. Gerakan tubuh dan urutan kontak dibuat secara manual; ini bukan perencana pemanjatan otomatis.

Yang telah diimplementasikan ​

KemampuanYang dilakukan runtime saat ini
Permukaan tidak rataMemeriksa titik tumpuan untuk setiap kaki, menyelaraskan normal telapak kaki yang telah dikalibrasi, dan menyesuaikan ketinggian pelvis.
Kaki yang berpijakMenahan kontak kaki pada fase tumpuan relatif terhadap permukaan yang menopangnya.
Platform bergerakMembawa kontak tersebut mengikuti tumpuan yang bergeser atau berputar.
Target tanganMengarahkan lengan ke posisi dan orientasi dalam ruang dunia, dengan bobot blend.
Objek yang dipegangMenurunkan target pergelangan tangan dari pose objek yang diinginkan dan transformasi genggaman tetap.
Jangkauan mustahilMembatasi penyelesaian dan melaporkan bahwa karakter perlu diposisikan ulang.

Ini adalah prototipe runtime yang harus diaktifkan secara eksplisit. Contoh interaktif mendemonstrasikan implementasinya; ini bukan berarti setiap game yang dibuat Cinevva otomatis mengaktifkannya.

Kaki yang berpijak membutuhkan kerangka acuan ​

Retargeter kami yang sudah ada telah mengoreksi sebagian pergeseran kaki saat mentransfer klip di antara karakter dengan proporsi berbeda. Grounding saat runtime memiliki input lain: permukaan tempat karakter berdiri saat ini.

Saat kaki memasuki fase tumpuan, lapisan baru ini merekam titik kontaknya dalam koordinat lokal objek penopang. Pada lantai statis, kaki tetap di tempat saat tubuh bergerak. Pada platform bergerak, titik tersimpan yang sama ikut bergerak bersama platform. Menetapkannya hanya dalam koordinat dunia akan membuat kaki tertinggal.

Pelvis kemudian bergerak dalam rentang ketinggian terbatas yang masih dapat dijangkau kedua kaki, dan setiap kaki diarahkan menuju targetnya. Salah satu pengujian awal menemukan kegagalan yang tidak kentara: penghalusan gerak pelvis saat melewati batas jangkauan sempat membuat kaki melayang di atas lereng. Kini penghalusan tetap berada dalam rentang yang memungkinkan.

Katak tersebut mengungkap kesalahan kalibrasi lain: menyentuhkan ujung jari kaki terendah tidak berarti telapak kaki telah menapak dengan benar. Demo kini mencocokkan bidang penopang dengan setiap mesh kaki yang telah diberi pose, sekaligus mengkalibrasi posisi dan normalnya. Regresi yang dirender mengukur tiga kontak telapak kaki yang terpisah serta titik permukaan terendah sepanjang Idle.

Pemeriksaan tumpuan tubuh bersama memperkirakan pusat massa dari segmen tubuh berbobot dan menyertakan contoh beban objek yang dibawa. Contoh berdiri dan menjangkau menggunakannya untuk mengarahkan pelvis ke kaki yang menanggung beban. Saat berjalan, perencana langkah kaki mengendalikan perpindahan beban yang telah diantisipasi; koreksi statis untuk memusatkan tubuh pada area pijakan tidak boleh melawan gerakan yang direncanakan. Diagnostik tetap menampilkan perkiraan COM dan kontak tumpuan. Gerakan berjalan melaporkan Perpindahan beban terencana, sedangkan tangga melaporkan bahwa gaya genggaman belum diverifikasi.

Gerakan berjalan tetap membutuhkan pengaturan waktu. Game memberikan bobot untuk setiap kaki: seberapa kuat kaki tersebut harus dianggap berpijak pada saat ini. Kaki yang berayun harus dilepaskan. Game juga menentukan gaya berjalan, pergerakan karakter, dan jarak bebas di atas anak tangga berikutnya. Keputusan tersebut tidak disimpulkan oleh solver IK.

Masukkan kunci ke lubang, lalu selesaikan pose tangan ​

Mengarahkan pergelangan tangan ke lubang kunci saja tidak cukup. Kunci memiliki panjang, sumbu pemasukan, dan offset genggaman. Ujungnya dapat meleset sekalipun pergelangan tangan mencapai targetnya dengan sempurna.

Dalam demo, urutan interaksi menentukan posisi dan rotasi kunci yang diinginkan. Genggaman memberi tahu kami letak pergelangan tangan yang diperlukan untuk menempatkan kunci di sana. Lengan kemudian diarahkan menuju pose pergelangan tangan tersebut. Kunci yang sebenarnya tetap terpasang pada tangan hasil penyelesaian, termasuk ketika posisi yang diminta tidak dapat dijangkau.

Contoh Target tidak terjangkau sengaja mendemonstrasikan kegagalan tersebut. Anggota gerak tidak diregangkan agar metrik terlihat berhasil; runtime melaporkan bahwa karakter perlu diposisikan ulang.

Contoh ini memiliki fase pendekatan, pemasukan, dan pemutaran yang dibuat secara manual. Sistem belum merencanakan genggaman jari atau memeriksa bentuk kunci terhadap ruang bebas internal kunci.

Contoh menuang mempertahankan cerat wadah di atas cangkir sambil memiringkan wadah mengelilinginya. Saat wadah berputar, posisi pergelangan tangan yang diperlukan berubah. Mekanisme target tangan yang sama mengikuti perubahan pose tersebut.

Aliran biru adalah efek visual yang diaktifkan selama proses memiringkan. Ini bukan simulasi fluida. Tujuannya di sini adalah memperlihatkan penyelarasan: tanpa koreksi, aliran meleset dari cangkir; dengan koreksi, aliran jatuh ke area penerima.

Tempat koreksi dijalankan ​

Urutan dalam game adalah:

Gerakkan karakter → evaluasi animasi → terapkan offset pose → selesaikan kontak dengan adegan → perbarui gerakan sekunder → render.

Runtime menyediakannya melalui createAnimator dengan konfigurasi sceneIK opsional. Game meneruskan bobot kontak, target tangan, dan status berpijak ke update. Runtime juga dapat membungkus mixer animasi Three.js yang sudah ada.

Setiap rig membutuhkan kalibrasi kaki dan genggaman yang bermakna. Pemetaan nama tulang membawa kita ke anggota gerak yang tepat, tetapi sendi pergelangan kaki bukanlah bagian bawah sepatu. Versi ini menggunakan satu titik tumpuan yang telah dikalibrasi per kaki; versi ini belum memodelkan seluruh area tumpuan tumit dan jari kaki.

Teknik dasarnya memiliki padanan yang telah mapan dalam IK dua tulang Unity dan solver IK Unreal. Implementasi kami adalah lapisan koreksi kecil di sisi engine yang dibuat berdasarkan kebutuhan karakter hasil auto-rigging kami.

Yang kami periksa—dan yang masih harus dikerjakan ​

Tahap verifikasi pertama mencakup 14 pengujian numerik dan integrasi, ditambah delapan skenario hasil render yang disampel sepanjang 3.840 frame. Kami memeriksa tumpuan bergerak, kontak pada lereng, track animasi konstan, transformasi koordinat, batas jangkauan, dan integrasi animator runtime. Otomatisasi browser juga membandingkan canvas dengan koreksi yang diaktifkan dan dinonaktifkan, serta menguji tata letak sempit.

Pengukuran memeriksa galat antara anggota gerak dan target. Pengukuran ini bukan bukti bahwa setiap bagian mesh berkulit bebas benturan, atau bahwa hasilnya terlihat alami pada setiap karakter. Contoh-contohnya sengaja dibuat cukup kecil agar dapat diperiksa bersama angka-angka tersebut.

Lapisan berikutnya mencakup perencanaan langkah kaki, tumpuan telapak yang lebih baik, jangkauan seluruh tubuh, genggaman jari, dan fase interaksi yang mempertimbangkan benturan. Cairan yang disimulasikan secara fisik merupakan sistem terpisah lainnya.

Untuk saat ini, hasil yang berguna sudah konkret: animasi dapat mempertahankan gerakan dasarnya sementara kaki dan tangannya merespons adegan pada setiap frame. Hal ini memberi karakter hasil auto-rigging titik awal untuk berinteraksi dengan dunia di sekitarnya.