Skip to content

Menganimasikan ekor yang tidak diberi tulang oleh auto-rigger ​

Oleh Oleg Sidorkin, CTO dan Co-Founder Cinevva

Diperbarui 11 September 2026: hal yang kami pelajari dari tikus menambahkan tekukan elastis, kontak dengan lantai, dan jenis kedua pengangkatan tubuh akibat ekor.

Seorang pengguna melakukan rigging pada rubah antropomorfis di auto-rigger kami, lalu memutar klip Walk. Tubuhnya baik-baik saja. Ekornya terlipat menempel pada kaki kiri seperti handuk basah, dan robek di tempat bobot kaki kiri dan kanan bertemu. Rubah tersebut menjadi contoh utama di bawah ini, dan perbaikannya kini sudah tersedia di auto-rigger serta pustaka runtime yang memutar klipnya.

Rubah dan tikus yang ditampilkan dalam artikel ini dibuat dengan generator model 3D kami, lalu di-rig dan dianimasikan di Cinevva.

Tiga salinan rubah yang berjalan dilihat dari belakang: rig asli dengan ekor terlipat mengelilingi kaki kiri, ekor kaku yang menggantung lurus ke bawah, dan ekor pada rantai tulang yang terangkat ke atas dan belakang

Dari kiri ke kanan, di tengah langkah pada frame yang sama: rig sebagaimana dihasilkan oleh auto-rigger, rig yang sama dengan seluruh ekor diserahkan kepada pelvis sebagai satu bagian, dan ekor pada rantai tulangnya sendiri dengan runtime yang mengayunkannya. Anda dapat mengorbit ketiganya lebih jauh di bawah.

Mengapa auto-rigger humanoid melakukan ini ​

Engine Fast kami dibuat berdasarkan Make-It-Animatable, yang memprediksi kerangka tetap bergaya Mixamo: 22 tulang tubuh, atau 65 dengan jari. Setiap vertex dalam mesh harus ditetapkan ke salah satu tulang tersebut. Ekor tidak ada dalam daftar, jadi model mengambil pilihan terbaik berikutnya yang diketahuinya dan menyerahkan vertex ekor kepada bagian tubuh yang paling dekat dalam ruang fitur hasil pembelajarannya. Untuk rubah ini, bagian tersebut adalah tulang kering kiri, sedangkan sisanya terbagi di antara kedua paha.

Ini bukan bug pada bobot. Ini adalah batasan templatnya. Tidak ada prompt atau pengaturan yang dapat membuat model menghasilkan tulang ekor karena memang tidak ada tulang ekor yang bisa dihasilkannya. Hal yang sama terjadi pada sayap, jubah, rambut panjang, dan apa pun yang menjuntai dari torso.

Sebelum mengubah apa pun, kami mengukur dampaknya pada 1.582 vertex ekor rubah. Jarak dari setiap vertex ke tulang yang benar-benar menggerakkannya (dibobotkan berdasarkan bobot skinning) rata-rata mencapai 47 cm pada model setinggi 191 cm. Ekor tersebut digerakkan dari jarak setengah meter.

Menemukan ekor ​

Pada tahap ini, GLB yang sudah di-rig adalah satu-satunya yang kami miliki, dan itu sudah cukup. Proses ini dapat dijalankan pada keluaran auto-rigger mana pun, bukan hanya milik kami.

Medan jarak terhadap kerangka. Untuk setiap vertex p dan setiap segmen tulang dari sendi a ke sendi b dalam bind space, jarak ke segmen adalah

d(p,ab)=‖p−(a+t(b−a))‖,t=clamp((p−a)⋅(b−a)∥b−a∥2,0,1)

dan jarak kerangka sebuah vertex adalah nilai minimum dari semua segmen. Sendi ujung diberi stub pendek yang melewati sendi agar moncong atau tangan tidak dianggap jauh dari tulangnya sendiri. Sebuah vertex dianggap jauh ketika jaraknya melebihi 7% tinggi model. Untuk rubah ini, batasnya adalah 13 cm.

Bagian kulit jauh yang saling terhubung. Vertex jauh dikelompokkan menjadi komponen terhubung mengikuti face mesh itu sendiri. Satu detail menghabiskan waktu kami satu jam: exporter memisahkan vertex pada seam UV dan hard-normal, sehingga mesh ini memiliki 23.129 vertex tetapi hanya 29.081 segitiga, dan graph face saja memecah satu ekor menjadi puluhan pulau. Kami terlebih dahulu mengelas vertex berdasarkan posisi, menjalankan pencarian konektivitas pada graph yang telah dilas, lalu menulis kembali bobot untuk setiap vertex asli.

Di mana bagian tersebut menempel? Collar suatu bagian adalah cincin vertex non-jauh yang bersebelahan dengannya. Pusatnya memberi tahu kami tempat bagian tersebut menjuntai, berdasarkan sendi terdekat, dengan satu bias: sendi torso atau paha yang berada dalam 1,5 kali jarak terdekat akan dipilih karena di sekitar pelvis, kepala tulang paha berada tepat sedekat pinggul, sedangkan akar ekor di antara keduanya seharusnya menjadi bagian tubuh. Kami sengaja tidak memercayai bobot collar untuk hal ini. Pada ekor yang dimodelkan sebagai shell terpisah (seperti kebanyakan model game), collar adalah cincin akar ekor itu sendiri, yang membawa bobot keliru yang sama dengan bobot yang ingin kami perbaiki.

Apakah ini anggota tambahan atau bagian tubuh? Ada dua pengujian. Kulit torso tebal yang jauh dari tulang membungkus sebuah tulang, sehingga pusat massanya kembali berada pada tulang tersebut. Ekor menonjol ke satu sisi, sehingga pusat massanya jauh dari semua tulang. Kami mengharuskan jarak kerangka centroid setidaknya 40% dari jangkauan bagian tersebut. Kemudian dilakukan pengujian bentuk: dengan λ1≥λ2 sebagai dua eigenvalue terbesar dari kovariansi bagian tersebut, tingkat pemanjangannya adalah λ1/λ2. Ekor memperoleh skor sekitar 2,6 di sini; jubah atau rok memperoleh skor mendekati 1. Hanya bagian panjang yang menjuntai dari pelvis yang menjadi rantai. Bagian panjang yang menjuntai dari tulang belakang (sarung, tabung anak panah, tali) adalah benda yang dikenakan, bukan tumbuh dari tubuh, sehingga bergerak kaku mengikuti tulang tempatnya menempel. Telinga yang menjuntai dari kepala dibiarkan apa adanya: bergerak kaku bersama kepala memang tepat untuk telinga.

Ekor rubah terdeteksi sebagai dua shell yang bertumpang tindih (bulu di atas kulit, tidak pernah dilas), sehingga bagian-bagian pada titik penempelan yang sama dengan bounding box yang bertumpang tindih lebih dari setengah digabungkan. Satu ekor, satu rantai.

Langkah pertama: membuatnya kaku ​

Perbaikan awal yang realistis membutuhkan waktu satu sore. Setiap vertex pada bagian tersebut diberi bobot 1,0 pada Hips. Ekor berhenti robek dan bergerak sebagai satu bagian bersama pelvis. Hasilnya tampak seperti papan, dan itulah rubah di tengah pada gambar. Kami merilisnya sebagai tonggak pencapaian karena nilai regangannya tepat nol secara bawaan, sehingga berguna sebagai acuan untuk pengukuran di bawah.

Langkah kedua: menumbuhkan rantai di sepanjang ekor ​

Koordinat sepanjang ekor. Kami menjalankan Dijkstra dari collar ke dalam bagian tersebut melalui edge mesh yang dibobotkan menurut panjang edge. Setiap vertex ekor mendapatkan jarak geodesik g dari akar, dan persentil ke-99 dari g menjadi panjang ekor L: 81 cm untuk rubah, atau 42% dari tinggi tubuhnya.

Sendi. Jumlah segmen adalah K=clamp(round(L/0.1H),3,8), yaitu empat untuk rubah. Sendi J0 adalah centroid collar, dan sendi Ji adalah centroid kulit yang jarak geodesiknya berada dalam setengah segmen dari iL/K. Dua iterasi Ji←12Ji+14(Ji−1+Ji+1) mencegah rantai berliku-liku di area dengan penampang yang tidak seimbang, seperti yang selalu terjadi pada ujung ekor lebat. Tulangnya adalah Tail_1 hingga Tail_K ditambah Tail_End tanpa bobot, diparent ke Hips, dan berbagi rotasi bind Hips sehingga masing-masing menjadi translasi murni dalam frame parent-nya. Inverse bind matrix-nya dapat diperoleh secara langsung, dan klip yang sudah ada tidak pernah menyebut tulang-tulang ini, sehingga tidak ada proses downstream yang rusak.

Bobot. Dengan s=Kg/L, k=⌊s⌋, dan f=s−k, sebuah vertex di segmen k dimiliki oleh tulang k+1 dan berbagi bagian ujung dengan tulang-tulang di sebelahnya:

wprev=clamp(0.5−2f, 0, 0.5),wnext=clamp(2f−1.5, 0, 0.5),wself=1−wprev−wnext

Pada sendi, kedua tulang bertemu dengan pembagian 50/50; di tengah segmen, satu tulang sepenuhnya memiliki kulit tersebut. Untuk segmen akar, "prev" adalah Hips, sehingga ekor menyatu dengan tubuh alih-alih membentuk lipatan tajam pada collar.

Setelah proses ini, jarak tulang berbobot pada ekor turun dari 47 cm menjadi 17 cm, kira-kira sebesar radius ekor itu sendiri. Itulah jarak terdekat yang wajar antara kulit dan tulang yang menggerakkannya.

Tampak samping rubah yang berjalan dengan kerangkanya digambar di atas mesh; empat tulang ekor memanjang dari pelvis di sepanjang ekor yang terangkat ke atas dan belakang

Langkah ketiga: harus ada sesuatu yang menggerakkan tulang ​

Tidak ada klip dalam pustaka kami yang memiliki track ekor, jadi tanpa proses tambahan, rantai akan mempertahankan bind pose dan rubah berjalan ke mana-mana dengan ekor seperti papan. Game menyelesaikan masalah ini dengan gerakan sekunder prosedural, dan kami melakukan hal yang sama dalam pustaka runtime yang sudah dimuat oleh setiap model ber-rig.

Setiap ujung sendi adalah partikel p dengan kecepatan v. Target istirahatnya T adalah posisi ujung sebagaimana ditentukan oleh bind pose, yang dihitung setiap frame dari transformasi dunia tulang parent saat ini. Partikel mengikuti pegas teredam:

p¨=ω2(T−p)−2ζωp˙+g

dengan ω=2πf. Segmen akar berayun pada f=0.9 Hz dan ujungnya pada setengah frekuensi tersebut karena ekor terdiri dari otot di pangkal dan bulu di ujung. Rasio redaman awal adalah ζ=0.45; pembaruan untuk tikus di bawah meningkatkannya menjadi 0.65 guna mengurangi overshoot. Gravitasi yang digunakan adalah 1 m/s², bukan 9,8; ekor memiliki otot. Kami mengintegrasikannya dengan Euler semi-implisit, lalu menerapkan batasan tali dengan memproyeksikan p kembali ke permukaan bola sepanjang tulang yang berpusat pada kepala tulang. Tali tidak dapat meregang, jadi kecepatannya sepanjang tali juga tidak boleh meregangkannya: komponen radial (p˙⋅n^)n^ dibuang dan ayunannya dipertahankan. Terakhir, rotasi tulang dibaca kembali: quaternion yang memutar arah bind-nya ke arah partikel.

Karena partikel berada di world space, perputaran atau percepatan pinggul membuat ekor tertinggal dan berayun dengan sendirinya. Tidak ada gerakan yang ditulis dalam skrip.

Ada tiga kesalahan yang patut kami akui karena masing-masing tampak baik-baik saja sampai diukur.

Versi pertama menarik setiap partikel dengan fraksi tetap menuju targetnya pada setiap frame, yaitu 12% pada 60 fps. Jika ditulis sebagai pegas, nilainya adalah ω≈0.12/Δt≈21 rad/s, jitter 3,4 Hz, dan karena kekakuan tersebut nyaris tidak memungkinkan segmen akar bergerak, seluruh gerakan menumpuk di ujung. Menuliskan pegas dalam satuan fisik memperbaiki kedua masalah sekaligus.

Versi kedua memasukkan koreksi tali kembali sebagai kecepatan, yaitu koreksi dibagi Δt. Ini terlihat seperti pembaruan position-based dynamics standar, dan tetap stabil selama pinggul bergerak lambat, seperti dalam siklus berjalan. Semakin cepat parent bergerak, semakin besar koreksinya, dan semakin besar pula kecepatan yang disuntikkannya. Ayunan pinggul sejauh setengah meter selama dua pertiga detik sudah cukup: satu tulang berputar 95°, sementara tulang-tulang di sebelahnya hanya bergerak 3°. Pengujian headless yang mengayunkan pinggul lebih keras daripada klip mana pun yang kami rilis berhasil menemukan masalah ini; siklus berjalan tidak akan pernah menemukannya.

Kesalahan ketiga adalah sudut carry di bawah. Sudut tersebut diterapkan dalam frame setiap sendi, sehingga ekor dengan empat tulang terangkat empat kali, melengkung menjadi bola di punggung rubah, dan merobek kulitnya sendiri pada setiap tekukan. Pengukuran di bawah menemukan masalah ini: regangan edge ekor mencapai p99 sebesar 2,3 dibandingkan baseline tubuh sebesar 1,3, lebih buruk daripada ketika ekor masih menempel pada tulang kering. carry kini menjadi pengangkatan seluruh ekor yang dibagi di antara semua sendinya.

Clipping. Ekor dimodelkan menggantung lurus ke bawah di antara kedua kaki, dan siklus berjalan membuat kaki menembusnya. Karena itu, rest pose yang dituju pegas bukanlah pose mesh aslinya: carry sebesar 50° mengangkat target istirahat ke belakang dan ke atas mengelilingi sumbu samping pinggul, seperti cara rubah membawa ekornya saat bergerak. Nilai 50° tersebut merupakan pengangkatan seluruh ekor yang dibagi di antara semua sendi, sehingga lengkungannya tetap lembut baik saat rantainya memiliki empat maupun delapan tulang. Selain itu, tidak ada partikel yang boleh melewati bidang melalui akar ekor yang menghadap ke depan, sehingga ekor tidak akan pernah berayun di antara kedua kaki.

Mengukurnya ​

Berikut adalah hasil pengukuran rubah asli dari 6 September, sebelum perubahan untuk tikus di bawah. Angka-angka ini mendokumentasikan solver rantai pertama, bukan benchmark baru untuk pengaturan default yang telah direvisi.

Gambar diam tidak membuktikan apa pun tentang robekan, jadi kami mengukur regangan edge selama klip diputar. Untuk setiap edge mesh yang kedua vertex-nya berada pada ekor, kami mengambil rasio panjang setelah skinning terhadap panjang bind pada 24 titik waktu yang tersebar merata sepanjang klip Walk. Rasio 1 berarti kulit tidak mengalami deformasi. Edge yang meregang melewati 1,5 atau menyusut di bawah 0,67 dianggap robek. Edge tubuh diukur dengan cara yang sama sebagai baseline untuk distorsi skinning normal.

Klip Walk, 96.864 sampel edge ekorp95p99maksimumrobek
Rig asli1,602,424,0311,4%
Kaku pada Hips1,001,001,000%
Rantai ekor1,091,181,300%
Tubuh, sebagai referensi1,131,291,78—

Pada rig asli, satu dari sembilan edge ekor meregang hingga melewati ambang robek, dan edge terburuknya mencapai empat kali panjang bind. Edge terburuk pada rantai hanya 30% lebih panjang, masih di dalam baseline tubuh sebesar 1,78, dan tidak ada yang robek. Ekor kaku tetap tepat pada 1,00 karena bergerak sebagai satu bagian; angka inilah yang memberi tahu kami bahwa harness pengukuran sudah benar sebelum kami memercayai hasilnya pada rantai.

Ekor yang benar-benar berayun harus sedikit mendeformasi kulitnya sendiri, jadi tugas rantai bukan mencapai 1,00, melainkan tetap di bawah tingkat deformasi yang sudah terjadi pada tubuh. Versi sebelumnya dari tabel ini menunjukkan p99 rantai sebesar 1,03, yang tampak lebih baik tetapi sebenarnya lebih buruk: ekornya nyaris tidak bergerak karena bug kecepatan di atas membuatnya terlalu teredam hingga menyerupai versi kaku.

Perbandingan live ​

Tiga salinan rubah, klip yang sama, frame yang sama. Seret untuk mengorbit dan gunakan roda gulir untuk melakukan zoom. Ganti klip, nonaktifkan fisika ekor untuk melihat rantai dalam rest pose terangkatnya, dan tampilkan tulang untuk melihat posisi rantai.

Rantai yang sama dari samping, ditampilkan sendiri, dengan kerangka yang terlihat. Sprint adalah klip yang paling jelas menunjukkan efek pegas.

Pelajaran dari tikus ​

Rubah membuktikan bahwa sebuah rantai dapat menghentikan robekan. Tikus dengan ekor panjang dan tipis membuat kesalahan gerak yang tersisa jauh lebih mudah terlihat. Tekukan tajam yang tersamarkan di dalam bulu rubah akan tampak seperti sendi patah pada tikus. Ekornya juga mencapai lantai, dan bentuk modelnya melengkung ke satu sisi. Itu adalah tiga masalah yang berbeda; menaikkan kekakuan pegas tidak menyelesaikan semuanya.

Coba tikus tersebut dengan berbagai animasi dalam pustaka di bawah ini. Seret karakter untuk mengorbitkan kamera, gulir deretan gambar mini ke samping, atau gunakan pencarian dan filter kategorinya untuk menemukan gerakan. Klik petak untuk memutarnya di pratinjau besar. Walk, Crouch Backward, Crawl Idle, dan Back Flip adalah pilihan awal yang berguna saat memeriksa ekor. Deretan ini menggunakan pratinjau animasi langsung yang sama seperti bagian utama animasi kami dan menyediakan seluruh katalog, dengan gerakan yang dimuat saat Anda menjelajahinya.

Buka pustaka animasi lengkap → untuk mencoba gerakan ini pada karakter ber-rig Anda sendiri dan mengekspor klip yang dipilih.

Rantai pegas tetap membutuhkan ketahanan terhadap tekukan ​

Partikel dibatasi agar panjang setiap tulang tetap terjaga, tetapi setiap sendi masih dapat berayun hampir secara independen. Batasan panjang mencegah peregangan; batasan tersebut tidak mencegah engsel terlipat. Tikus itu memperlihatkan perbedaan tersebut dengan sangat jelas.

Sebelum perbaikan pada tikus: kerangka ekor berubah arah secara tajam di dekat ujung, dan mesh berakhir dengan tekukan ke bawah

Sebelum perbaikan: menjaga panjang segmen tetap utuh belum cukup untuk mempertahankan kurva yang mulus.

Kini kami mengaitkan tekukan tambahan pada sendi-sendi yang berdekatan, yang diukur relatif terhadap kurva istirahat. Tekukan dibandingkan dalam kerangka acuan yang sama agar perbedaan sumbu tulang tidak mengubah tekukan ke kiri menjadi puntiran yang tidak berkaitan pada sendi berikutnya. Setiap langkah membaca cuplikan keadaan tetangganya, bukan nilai yang baru diperbarui sebagian. Campuran pengaitan tersebut adalah 1−e−kΔt, dengan laju bawaan k=12 per detik, bukan pecahan tetap per frame yang dirender.

Tekukan elastis suatu sendi dibatasi hingga 30° di luar arah istirahatnya. Kami juga meningkatkan redaman menjadi 0,65 dan menghapus kecepatan yang terus mendorong ke batas tekukan agar energi tidak menumpuk lalu dilepaskan sebagai sentakan. Pangkal tetap ditopang oleh pinggul dan ujungnya tetap lebih lunak. Kontak dapat mengesampingkan batas tekukan ketika ekor perlu terbaring di lantai.

Mengaitkan rotasi, bukan posisi partikel. Beri nomor pada N tautan mulai dari i=0 di pinggul. Misalkan hi adalah pangkal tautan, pi adalah ujung prediksinya, dan ℓi adalah panjangnya. Arah kandidatnya adalah di=(pi−hi)/∥pi−hi∥. Dalam kerangka induk saat ini, misalkan ri adalah arah istirahat satuan dan d~i adalah arah kandidat. Tulis swing(a,b) untuk kuaternion satuan terpendek yang membawa vektor satuan a ke b. Jika Ai merotasi kerangka istirahat induk tersebut ke kerangka pinggul bersama, tekukan yang kami bandingkan dengan tetangga adalah

qi=Aiswing(ri,d~i)Ai−1.

Konjugasi ini mengubah kerangka koordinat tekukan; konjugasi tersebut tidak menambahkan rotasi lain pada karakter. Dengan menggunakan cuplikan keadaan qjold dari langkah sebelumnya, target tetangga dan tekukan terkait pada sendi interior adalah

q¯i=slerp(qi−1old,qi+1old,12),α=1−exp⁡(−kΔt),qi∗=slerp(qi,q¯i,α).

Di pangkal, target tetangga berada di tengah antara tekukan sendi berikutnya dan kuaternion identitas I, yang mewakili dukungan dari pinggul. Ujung bebas menggunakan satu tetangganya; ekor dengan satu tautan melewati pengaitan tetangga. Dengan k=12s−1, nilai α sekitar 0,181 pada 60 fps dan 0,330 pada 30 fps. Hal ini memberi pengaitan laju berbasis waktu, meskipun solver lengkap masih memiliki kesalahan integrasi dan kontak yang bergantung pada langkah waktu.

Untuk kuaternion satuan qi∗ dengan komponen skalar wi, sudut rotasi terpendeknya adalah θi=2arccos⁡(clamp(|wi|,0,1)). Batas elastisnya adalah

qilimited={qi∗,θi≤θmax,slerp(I,qi∗,θmax/θi),θi>θmax,θmax=π/6.

Kami mentransformasikan tekukan ini kembali ke kerangka induk dan menerapkannya pada ri sebelum proyeksi kontak. Ini adalah aturan lokal untuk menghaluskan tekukan, bukan simulasi batang elastis lengkap: aturan ini membagikan kelengkungan tambahan dan membatasinya tanpa mengklaim menyelesaikan energi tekuk global.

Pose yang dimuat belum tentu merupakan pose bind ​

Berkas tikus yang tersimpan sudah memiliki rotasi sekitar 28° pada sendi ekor terakhirnya. Kami membaca rotasi yang dimuat tersebut sebagai posisi netral, lalu menambahkan gerakan pegas di atasnya. Pose yang sebelumnya dianimasikan atau diekspor telah menjadi bagian permanen dari target pegas.

Kini solver memulihkan transformasi lokal netral dari matriks bind invers kerangka jika tersedia. Jika sebuah rig tidak memiliki helper Tail_End, segmen terakhirnya meneruskan garis singgung yang datang, yang dinyatakan dalam kerangka lokal tulang terakhir itu sendiri. Menyalin vektor dari kerangka induk akan salah begitu tulang terminal memiliki orientasi yang berbeda.

Lengkungan ke satu sisi memiliki penyebab lain: lengkungan tersebut memang ada dalam geometri bind. Karena itu, pemulihan pose bind yang benar tetap mempertahankan bias tersebut. Kini simulasi secara bawaan menggunakan busur istirahat yang terpusat, yang dibuat dalam ruang pinggul dan dikonversi ke kerangka setiap induk yang telah dikoreksi. restCurve dapat mencampurkan kembali lengkungan model: 0 adalah busur terpusat, sedangkan 1 mempertahankan kurva buatan kreator. Ini mengubah sasaran pegas; tidak menulis ulang mesh atau bobot skin-nya.

Memulihkan transformasi acuan. Misalkan Bi menyatakan matriks bind invers suatu tulang. Transformasi bind-world-nya adalah Wi0=Bi−1, sehingga ketika tulang dan induknya sama-sama memiliki matriks bind, transformasi lokal netralnya adalah

Li0=(Wparent(i)0)−1Wi0.

Dekomposisi Li0 menghasilkan translasi dan rotasi lokal yang kami perlukan. Membaca kuaternion yang dimuat justru akan menggantikan acuan ini dengan frame animasi tersimpan yang sembarang.

Membuat busur terpusat. Misalkan ai adalah arah satuan buatan kreator untuk segmen i dalam ruang pinggul. Kami menghapus komponen menyamping dari arah akar untuk memperoleh c=normalize(0,a0y,a0z), dengan arah ke bawah sebagai cadangan jika proyeksi tersebut lenyap. Misalkan β∈[0,1] adalah restCurve, dan C adalah sudut carry total dalam radian. Dengan rot(q,v) menyatakan rotasi vektor v oleh kuaternion q, arah yang diinginkan dalam ruang pinggul adalah

Qi(β)=slerp(I,swing(c,ai),β),ui=Rx(Ci+1N)rot(Qi(β),c),ri=rot(Ai−1,ui).

Di sini Rx adalah rotasi mengelilingi sumbu kiri-kanan pinggul. Yang terpenting, Ai mencakup koreksi istirahat yang sudah diterapkan pada sendi-sendi sebelumnya. Hal ini menjadikan ui arah absolut yang dimaksudkan untuk segmen ini, alih-alih menambahkan kembali koreksi pelurusan pada setiap sendi. Pada β=0, lengkungan model ke samping dihapus; pada β=1, arahnya dipertahankan sebelum carry diterapkan.

Ekor boleh menyentuh tanah; ekor tidak boleh mengangkat tikus ​

Kontak dengan tanah merotasi segmen ke perpotongan antara bola panjang segmen dan lantai. Hanya membatasi ketinggian partikel akan memperpendek tulang; membatasinya lalu memulihkan panjang dapat membuatnya kembali masuk ke bawah tanah. Kami menyisakan 0,025 satuan dunia di bawah garis tengah untuk ketebalan, membuang kecepatan kontak ke bawah, dan meredam pergeseran. Lantai datar secara bawaan berada pada Y dunia = 0 dan dapat dipindahkan atau dinonaktifkan. Ini adalah batasan bidang, bukan medan atau tumbukan mesh penuh.

Perpotongan bola–lantai. Tulis F=g0+ρ untuk ketinggian lantai ditambah jarak bebas garis tengah, dengan g0=0 dan ρ=0.025 secara bawaan. Segmen harus memenuhi

∥pi−hi∥=ℓi,(pi)y≥F.

Jika titik ujung yang diprediksi berada di bawah lantai, tentukan u=(F−hiy)/ℓi. Ketika |u|≤1, kontak berada pada sebuah lingkaran horizontal. Jika t adalah arah satuan horizontal, titik ujung yang dikoreksi adalah

pi′=hi+ℓi(1−u2t+uey),ey=(0,1,0).

Ketinggiannya tepat F, dan jaraknya dari pangkal tepat ℓi, karena (1−u2)+u2=1. Kami memilih t dari proyeksi horizontal arah kandidat, dengan arah istirahat sebagai cadangan jika proyeksi tersebut lenyap. Bidang pembatas di belakang pinggul dapat membatasi bagian lingkaran yang diizinkan. Kontak lebih diprioritaskan daripada batas tekukan elastis. Jika pangkal berada sangat jauh di bawah lantai sehingga u>1, rotasi segmen dengan panjang tetap ini tidak akan dapat mencapainya; implementasi membatasi u alih-alih meregangkan tulang atau mengangkat tubuh.

Setelah proyeksi kecepatan lainnya, partikel yang bersentuhan dihilangkan sisa kecepatan turunnya dan diredam kecepatannya:

vi′=e−γΔt[vixmax(0,viy)viz],γ=8s−1.

Ini adalah kontak tidak elastis dengan redaman sederhana, bukan model gesekan Coulomb. Cara ini mencegah gravitasi menyimpan kecepatan ke bawah saat ekor beristirahat di lantai.

Hal itu menyelesaikan penetrasi ekor, tetapi ada dua tempat lain yang memungkinkan ekor membuat kaki melayang.

Pertama, penampil menempatkan titik terendah dari seluruh mesh yang dimuat di atas tanah. Jika ekor yang tersimpan menggantung di bawah telapak kaki, seluruh karakter akan terangkat untuk mengakomodasi ekor. Penempatan penampil kini mengabaikan skin yang didominasi ekor saat menentukan lantai tubuh, sementara pembingkaian kamera tetap mencakup seluruh karakter.

Kedua, proses penempatan tubuh di tanah oleh retargeter juga memperhitungkan ekor. Saat Back Flip, proses tersebut menaikkan pelvis agar skin itu tidak menyentuh tanah, meskipun solver ekor independen akan memindahkannya setelah itu.

Skin mana yang boleh mengangkat pelvis? Misalkan S adalah titik dukungan skin tubuh yang diambil sebagai sampel, T adalah titik yang didominasi tulang ekor, dan E adalah titik yang dimiliki solver kontak anggota gerak. Lantai acuan diukur saat kalibrasi dari S∖T. Jarak bebas tubuh yang tersisa pada frame t adalah

fbody=minv∈S∖Tyv0,c(t)=minv∈S∖(T∪E)yv(t)−fbody,Lraw(t)=max(0,a(t)−c(t)).

Di sini a(t)≤0 adalah toleransi yang berasal dari sumber untuk turun ke bawah lantai acuan. Lraw adalah pengangkatan yang diminta sebelum penghalusan temporal dan rekonsiliasi anggota gerak oleh retargeter. Pengecualian ekor yang sama harus muncul dalam kedua nilai minimum: menghapusnya hanya dari pemeriksaan pose saat ini tetap akan menghasilkan lantai acuan yang salah. Implementasi mengambil sampel skin yang dikelompokkan berdasarkan tulang dominan, alih-alih mengevaluasi setiap verteks pada setiap frame.

Untuk perbandingan di bawah ini, pengangkatan tambahan yang dilaporkan adalah selisih antara lintasan pelvis akhir, bukan sekadar koreksi mentah:

Δyhips(t)=yhipstail counted(t)−yhipstail excluded(t).

Pengangkatan pelvis yang diukur menjelang akhir Back Flip

Kami mengambil sampel tikus yang sama pada waktu animasi yang sama, dengan mengubah apakah ekor disertakan dalam penempatan tubuh di tanah. Kedua kolom menggunakan koordinat dunia model yang sama; selisihnya mengisolasi ketinggian tambahan yang muncul karena ekor ikut diperhitungkan.

Waktu dalam klip 1,93 dtkTinggi pelvis: ekor dihitungTinggi pelvis: ekor dikecualikanPengangkatan tambahan karena ekor dihitung
1,16 dtk50,5 cm35,0 cm15,4 cm
1,55 dtk81,3 cm70,3 cm11,0 cm
1,84 dtk92,2 cm77,2 cm15,0 cm
1,93 dtk90,6 cm77,2 cm13,4 cm

Karakter memang seharusnya naik saat berdiri setelah mendarat. Kesalahannya adalah pengangkatan tambahan pada kolom terakhir, bukan gerakan pemulihan yang memang diinginkan tersebut. Nilai dibulatkan secara terpisah dari posisi dunia yang diambil sebagai sampel.

Pada tikus ini, mengecualikan ekor menghilangkan sekitar 15 cm pengangkatan pelvis tambahan menjelang akhir Back Flip. Mendekati akhir, pemeriksaan tubuh tetap berada dalam kisaran sekitar satu milimeter dari lantai acuannya, alih-alih melayang beberapa sentimeter di atasnya. Kini skin ekor tidak menentukan lantai tubuh maupun koreksi yang mengangkat pelvis. Solver ekor sendiri hanya merotasi tulang ekor; solver tersebut tidak pernah mentranslasikan model, pinggul, atau kaki.

Animasi dapat mewarisi pose bahkan sebelum Anda memutarnya ​

Pose membungkuk yang terangkat mengungkap masalah terpisah. Kami menghasilkan klip pustaka secara progresif agar penampil dapat mulai memutar sebelum semua klip siap. Retargeting menggunakan kerangka yang sama dengan pemutaran. Di antara proses solver, pratinjau dapat memindahkan pelvis, lalu klip berikutnya akan membaca pose yang telah dianimasikan tersebut sebagai acuan kalibrasinya. Mengatur ulang saat berganti klip tidak dapat memperbaiki acuan buruk yang sudah telanjur dimasukkan ke trek hasil generasi.

Kini retargeting bekerja pada salinan kerangka privat yang dibuat dari kalibrasi stabil yang direkam sebelum pemutaran dimulai. Permintaan klip berikutnya menggunakan kembali acuan tersebut, dan permintaan serentak memiliki tulang yang terpisah. Sebuah uji regresi sengaja memindahkan dan merotasi pinggul aktif di antara klip yang dikirim; trek yang dihasilkan harus tetap identik dengan proses yang bersih, dan proses solver tidak boleh mengubah pose aktif. Tidak setiap gerakan yang terlihat merupakan bug. Climb Idle memiliki sedikit gerakan naik-turun pada panggul dalam loop sumbernya, sementara root tetap diam. Dan hasil solve Crawl Idle yang baru mempertahankan tangan tikus di bawah kepalanya sepanjang loop; tangkapan layar dengan tangan terangkat ternyata sesuai dengan klip terdahulu yang terkontaminasi, bukan bukti bahwa animasi sumber memang menginginkan pose tersebut. Membandingkan sumber, hasil solve baru, dan hasil yang sedang dimainkan mencegah kami meratakan gerakan yang disengaja hanya untuk menyembunyikan kesalahan kalibrasi.

Yang sekarang kami periksa ​

Pemeriksaan mencakup sapuan pinggul cepat pada rantai dengan panjang berbeda, tekukan antartulang yang lebih mulus, respons kiri/kanan yang setara, pemulihan bind pose, tulang terminal yang diputar tanpa helper, dan penutupan loop setelah pemanasan. Pengujian lantai mencakup gerakan berjongkok, bidang lantai yang ditinggikan, penyesuaian posisi, serta pelepasan saat pinggul naik. Pengujian regresi terpisah memastikan bahwa kontak ekor tidak pernah menggerakkan tubuh dan skin ekor tidak dapat meminta panggul diangkat.

Pemeriksaan ini menetapkan invarian tertentu. Pemeriksaan tersebut tidak menggantikan pengamatan terhadap tikus saat menjalani berbagai gerakannya, dan juga tidak menetapkan angka peregangan baru untuk rubah. Contoh live menggunakan solver yang telah direvisi; tabel rubah sebelumnya tetap menjadi catatan pengukuran awal.

Dampaknya bagi Anda ​

Jika Anda melakukan rigging karakter berekor di cinevva.com/tools/rigger, ekornya akan dihasilkan pada rantai tulangnya sendiri, status job menyertakan entri appendages yang menjelaskan apa yang ditemukan, dan preview akan mengayunkannya. Model yang di-rig melalui API platform mendapatkan file yang sama. Integrasi awal dalam rt/1.1.12 membuat createAnimator menemukan tulang Tail_* dan menggerakkannya tanpa kode tambahan; frekuensi, damping, gravitasi, dan sudut angkut spring tersedia sebagai opsi jika Anda menginginkan ekor yang terasa lebih berat atau lebih lamban. File lama tanpa rantai ekor dapat diproses ulang dengan melakukan rigging kembali. Perubahan tanggal 11 September yang dijelaskan di atas kini telah aktif di preview web Cinevva. Game yang dikunci ke runtime lama dan klip yang telah diekspor sebelumnya tidak diperbarui secara otomatis. Klip bake yang sudah ada perlu dibuat ulang agar mendapatkan perbaikan tersebut.

Di Blender. Add-on menjalankan pass yang sama pada tabel rig sebelum membangun armature, sehingga ekor yang di-rig di komputer Anda sendiri mendapatkan rantai yang sama dengan penamaan yang sama. Terdapat kotak centang Tail di samping Fingers, dan kartu hasil menampilkan apa yang ditemukan.

Di luar runtime kami. Spring dalam game tidak membantu seseorang yang membuka file di Blender, Unity, atau Unreal, tempat ekornya hanya akan diam. Karena itu, proses ekspor kini melakukan bake: setiap klip yang dipilih disimulasikan dan rotasi ekornya disampel menjadi keyframe nyata. Eksportir menjalankan klip tanpa menampilkannya hingga ekor kembali ke posisi awal pass, lalu mulai merekam, karena siklus yang di-bake dari kondisi awal tanpa pemanasan tidak akan menutup dengan mulus dan ekor akan meloncat saat loop diulang. Bagian ujung sengaja dibuat sebagai sambungan paling lentur, sehingga transiennya paling lambat menjadi stabil dan satu pass pemanasan tidak selalu cukup.

Pass ini sengaja dibuat konservatif. Pass hanya menumbuhkan rantai untuk bagian panjang yang menggantung dari panggul. Telinga, rambut, dan lengan baju tidak disentuh, begitu pula bagian lebar pada torso: versi sebelumnya menyerahkan cape atau rok secara kaku kepada tulang torso, dan setelah melihatnya bergerak pada unggahan sungguhan, kami berubah pikiran. Salah satunya adalah pakaian dengan 6.540 vertex di pinggang yang telah didistribusikan secara tepat oleh rigger ke seluruh pinggul dan kedua paha; satu tulang akan membuatnya sama sekali tidak dapat mengikuti gerakan kaki. Menyerahkan pakaian kepada satu tulang merupakan perubahan besar pada karakter seseorang berdasarkan tebakan mengenai bagian tersebut, jadi sekarang hal itu harus Anda minta, bukan sesuatu yang terjadi begitu saja. Belum ada collision dengan kaki selain bidang depan, dan belum ada ayunan idle saat karakter berdiri diam, sehingga ekor rubah yang berdiri akan menggantung tenang dalam pose angkutnya. Keduanya adalah hal berikutnya dalam daftar kami, bersama penerapan serupa untuk sayap, yang memerlukan rest pose dan spring berbeda.