Skip to content

Selesaikan permukaannya, bukan kerangkanya ​

Oleh Oleg Sidorkin, CTO dan Salah Satu Pendiri Cinevva

Bagian 1 mengukur empat auto-rigger terhadap rig buatan seniman pada dua belas hewan CC0 dan menemukan satu kelemahan yang sama: semuanya membuat hewan berkaki empat dengan kaki yang nyaris lurus. Bagian itu ditutup dengan rencana untuk memperbaiki rig, karena kaki tanpa tekukan tidak dapat mereproduksi sudut lutut buatan seniman, sebaik apa pun retargeting-nya.

Lalu muncul pertanyaan yang lebih sederhana saat kami memperdebatkan hasilnya. Mengapa kita memindahkan animasi antarkerangka sejak awal?

Kerangka adalah mesin untuk mendeformasi permukaan. Permukaanlah yang dilihat pemain, dan klip buatan seniman sudah memberi tahu kita dengan tepat di mana permukaan itu seharusnya berada, verteks demi verteks, pada setiap frame. Jadi, lewati sepenuhnya pemetaan kerangka ke kerangka. Putar klip seniman sekali, rekam mesh yang telah dideformasi, lalu selesaikan transformasi kerangka hasil auto-rigging agar skinning-nya sendiri mereproduksi permukaan tersebut semirip mungkin. Hasilnya adalah klip yang secara native berada di ruang rig baru. Tidak masalah jika semua tulangnya dinamai bone_0.

Diagram pipeline: dari klip seniman ke permukaan terdeformasi, lalu penyelesaian per frame, hingga menjadi klip dalam ruang milik rig itu sendiri
Keseluruhan pipeline. Tidak ada satu pun tahap yang memetakan satu tulang ke tulang lain, sehingga masalah korespondensi yang menghabiskan sebagian besar upaya di bagian 1 pun lenyap.

Ini bukan gagasan baru dalam literatur. Ini adalah bagian transformasi dari dekomposisi skinning, SSDR karya Le dan Deng pada 2012, dan merupakan cara solver motion capture menyesuaikan rig apa pun dengan marker yang padat. Situasi kami adalah kasus yang mudah: pembuat rig sudah menyediakan kerangka dan bobot, sehingga satu-satunya hal yang belum diketahui adalah transformasi tulang pada setiap frame.

Metodenya, serta kontrol yang menjaganya tetap jujur ​

Pada setiap frame, kami mencari satu transformasi per tulang yang meminimalkan jarak antara permukaan hasil skinning rig dan permukaan target. Dengan bobot yang tetap, transformasi terbaik setiap tulang memiliki solusi bentuk tertutup, yaitu rigid fit berbobot menggunakan metode quaternion Horn. Linear blend skinning menghubungkan tulang melalui verteks bersama, jadi kami memproses tulang satu per satu secara berulang, dengan setiap penyelesaian memperhitungkan kontribusi semua tulang lain pada saat itu, hingga residual berhenti berubah. Setiap frame dimulai dari hasil frame sebelumnya.

Semuanya berjalan dalam bind space, tempat identitas skinning berlaku secara tepat, apa pun konvensi yang digunakan saat file diekspor. Korespondensi antara mesh seniman dan mesh pembuat rig yang dilas ulang atau disubdivisi ditentukan dengan nearest-neighbour pada rest pose yang telah disejajarkan. Dalam kasus ini hasilnya tepat karena keduanya adalah hewan yang sama.

Aturan desain yang paling penting: proses kontrol yang harus menghasilkan nol. Kami menyelesaikan rig seniman terhadap klipnya sendiri, yang secara konstruksi pasti memiliki solusi sempurna. Jika solver tidak dapat menemukannya, semua hasil lain yang diberikannya tidak berarti apa-apa. Kontrol mencapai 0,008% dari diagonal model, dengan satu verteks terburuk pada 0,08%. Itulah batas dasar untuk mengukur semua hasil lainnya.

Mendapatkan angka nol yang dapat dipercaya membutuhkan tiga percobaan ​

Proses kontrol pertama berhenti di 3% dan tidak mau bergerak meskipun jumlah iterasinya ditingkatkan tiga puluh kali lipat. Penyebabnya layak dicatat, karena masing-masing tidak terlihat dari luar.

Masalah terbesarnya adalah jebakan API. Versi three.js yang lebih baru mengganti nama boneTransform menjadi applyBoneTransform dan diam-diam mengubah perilakunya: fungsi baru mengambil posisi input dari vektor yang diberikan kepadanya dan tidak pernah membaca geometri. Ketika diberi vektor sementara yang digunakan ulang, fungsi itu menghitung setiap verteks dari output verteks sebelumnya. Target yang dihasilkan tampak masuk akal dan mulus, tetapi sebenarnya sampah. Selama satu jam yang memalukan, hasil itu bahkan mendukung teori terperinci tentang skala armature yang sangat cocok dengan angkanya, tetapi sepenuhnya fiktif. Entry point yang benar adalah getVertexPosition. Kontrol berhasil menangkap masalah itu, dan itulah alasan utama untuk memilikinya.

Dua masalah lainnya lebih kecil. Power iteration pada matriks Horn berhenti pada sekitar seperseribu derajat karena spectral shift yang membuatnya konvergen juga memperkecil celah yang menjadi arah konvergensinya. Karena itu, kami beralih ke rotasi Jacobi, yang eksak untuk matriks 4x4. Selain itu, pengujian penghentian dini berdasarkan kemajuan relatif menghentikan iterasi saat nilainya masih terus menurun. Sekarang, penghentian mengukur kemajuan absolut terhadap skala model.

Seberapa banyak gerakan yang benar-benar dapat dibawa setiap pembuat rig ​

Setelah solver tervalidasi, kami menyelesaikan dua klip seniman, Walk dan Gallop, ke setiap rig untuk enam hewan yang didukung oleh semua pembuat rig. Skornya adalah proporsi perpindahan permukaan dari gerakan yang dapat direproduksi oleh rig. Sekarang kami punya nama untuknya: kualitas transfer.

Plot titik kualitas transfer menurut pembuat rig untuk Walk dan Gallop, dengan kontrol seniman mendekati 100 persen dan RigNet mendekati 50 persen
Kualitas = 1 − residual hasil penyelesaian / magnitudo gerakan, dirata-ratakan dari enam hewan. Baris kontrol adalah rig seniman yang diselesaikan terhadap klipnya sendiri.
rigWalkGallop
seniman (kontrol)99.8%99.9%
Anything World94.4%91.9%
Tripo92.3%89.1%
SkinTokens, dengan kerangka seniman82.5%89.4%
SkinTokens80.9%88.0%
RigNet48.5%58.3%

Sekarang bandingkan dengan bagian 1, karena peringkatnya berbalik.

RigNet memiliki tekukan kaki terbaik di antara keempatnya dan merupakan satu-satunya pembuat rig yang kerangkanya lolos ambang kelayakan pengendalian kami pada kedua belas hewan. Di sini, RigNet kehilangan separuh gerakan berjalan. Verteks terburuknya berada sejauh 20 hingga 31% ukuran model dari posisi permukaan yang seharusnya, dan kegagalannya konsisten pada keenam hewan, dengan kualitas 38 hingga 59% pada semuanya. Sementara itu, Tripo dan Anything World, dua rig dengan kaki paling lurus yang kami ukur, justru membawa animasi dengan paling baik.

Penjelasannya sederhana setelah dinyatakan. Klip hasil penyelesaian dapat mentranslasikan sendi, bukan hanya merotasinya, dan track translasi per sendi adalah data animasi biasa yang sepenuhnya valid. Dengan translasi, rantai lurus tetap dapat mengikuti permukaan yang menekuk, sehingga tekukan tidak lagi menjadi kendala utama. Kendala sebenarnya adalah apakah bobot skinning membagi mesh menjadi bagian-bagian yang mengikuti tulang dengan bersih. Bobot milik pembuat rig komersial tergolong bagus. Bobot RigNet, yang tersebar pada rantainya yang tidak beraturan, tidak dapat mengikuti permukaan, ke mana pun solver memindahkan tulang-tulangnya.

Jadi, kedua pengukuran tersebut menjawab dua pertanyaan yang berbeda. Rasio tekukan menentukan pose yang dapat dibuat oleh rig runtime berbasis rotasi, yang merupakan konteks bagian 1. Kualitas transfer menentukan apa yang dapat diekspresikan oleh klip hasil penyelesaian yang telah di-bake, yang merupakan konteks bagian ini. Dalam pipeline klip hasil penyelesaian, pembuat rig yang sudah kami gunakan menghasilkan rig berkualitas 92%, bukan rig yang menempati posisi terakhir.

Ada satu hasil lain yang tersembunyi dalam tabel itu: memberikan kerangka milik seniman kepada SkinTokens nyaris tidak mengubah skornya. Batas kemampuannya ditentukan oleh bobot, bukan penempatan sendi.

Melihatnya langsung, bukan sekadar memercayai angka ​

Angka lebih dahulu, lalu pengamatan visual. Solver yang sama menggerakkan viewer langsung, tempat mesh lengkap dari setiap rig di-skin menggunakan transformasi hasil penyelesaian, digambar di atas permukaan ground truth milik seniman sebagai siluet gelap, dan setiap verteks diberi warna berdasarkan error sesaatnya. Biru berarti nol. Merah berarti 3% dari diagonal model atau lebih buruk.

Walk, diselesaikan ke setiap rig. Dari kiri ke kanan: ground truth seniman, Tripo, Anything World, SkinTokens, RigNet. Kaki RigNet menyala merah dan bergeser keluar dari siluet pada setiap langkah. Seperti inilah kualitas 48%.
Gallop memberi tekanan lebih besar pada setiap rig. Perhatikan kaki belakang saat terentang penuh: Tripo dan Anything World tetap bertahan, sedangkan RigNet berantakan.

Visual dan tabel tidak mungkin saling menyimpang, karena viewer merender menggunakan fungsi yang persis sama dengan yang diukur oleh metrik. Satu panel membutuhkan catatan: rusa SkinTokens tidak menampilkan heatmap. Mesh-nya memiliki 181.000 verteks dan kami melewatkan korespondensi mesh penuh di atas 60.000 verteks, sehingga panel tersebut hanya mengandalkan siluet.

Dampaknya bagi kami ​

Satu penyelesaian membutuhkan waktu setengah detik hingga beberapa detik per klip per rig, dalam JavaScript di browser, tanpa melibatkan GPU. Itu cukup murah untuk melakukan bake pada seluruh set klip hewan berkaki empat saat rig dibuat. Klip yang telah di-bake juga menyederhanakan runtime: tidak ada lagi retargeting kerangka untuk hewan, cukup memutar klip dalam ruang milik rig itu sendiri, ditambah foot locking yang sudah kami miliki untuk menjaga kontak dengan tanah.

Ini juga memberi kami ambang penerimaan kedua. Pemeriksaan geometris dari bagian 1 menunjukkan apakah sebuah rig dapat dikendalikan. Kualitas transfer menunjukkan seberapa banyak animasi nyata yang dapat dipertahankannya. Sebuah pembuat rig dapat lolos pemeriksaan pertama dan gagal pada pemeriksaan kedua, dan itulah yang terjadi pada RigNet.

Batasan, dinyatakan dengan jelas ​

Skor ini adalah batas atas setiap rig, bukan janji. Solver dapat mentranslasikan sendi, sehingga panjang tulang tidak selalu dipertahankan selama gerakan, dan rig yang sangat mengandalkan translasi dapat terlihat seperti karet pada pose ekstrem. Verteks terburuk pada Gallop, yang sesaat mencapai 9 hingga 20% bahkan pada rig yang bagus, muncul tepat pada momen-momen tersebut. Varian penyelesaian yang hanya menggunakan rotasi akan mengukur konsekuensi itu secara jujur, dan angka tersebut masih perlu kami hitung: hasilnya akan menunjukkan seberapa besar penalti kaki lurus dari bagian 1 yang tetap ada ketika translasi tidak diizinkan.

Kesenjangan menuju produksi terletak pada korespondensi. Dalam tolok ukur ini, pembuat rig memasang rig pada mesh yang sama dengan yang dianimasikan seniman, sehingga pencocokan verteks menjadi sepele. Hewan yang diunggah pengguna memiliki mesh berbeda, dan memindahkan gerakan permukaan seniman ke mesh tersebut terlebih dahulu adalah masalah tersendiri, dengan sejumlah pendekatan yang sudah dikenal tetapi belum kami ukur.

Lalu ada ukuran sampel: enam hewan, dua klip, 24 frame per klip, dengan constraint yang disubsampel menjadi lima ribu verteks pada mesh terpadat. Cukup untuk memeringkat pembuat rig dengan yakin, tetapi belum cukup untuk mengutip angka hingga dua tempat desimal.

Hewan-hewan tersebut adalah aset CC0 dari Quaternius, metodenya merupakan fitting bentuk tertutup berusia empat puluh tahun ditambah kesabaran, dan proses kontrol adalah bagian yang kami sarankan untuk dibuat terlebih dahulu oleh siapa pun yang ingin mereproduksi hasil ini. Jika Anda pernah menyelesaikan animasi ke dalam rig dan menemui jebakan yang sama dengan kami, atau jebakan yang berbeda, kami ingin bertukar catatan di Discord.