Rambut seharusnya berayun, bukan berubah menjadi tentakel
Oleh Oleg Sidorkin, CTO dan Co-Founder Cinevva

Seorang karakter menolehkan kepalanya. Rambutnya seharusnya mengikuti sesaat kemudian, berayun sedikit, lalu kembali tenang. Versi pertama kami melakukan hal lain: ujung-ujung rambut melengkung ke bawah, seolah-olah gaya rambut itu sedang mencoba berubah menjadi tentakel.
Panjang tulangnya tetap terjaga. Simulasi tetap stabil. Angka-angka yang kami pantau lolos pengujian. Namun, gerakannya masih terlihat keliru.
Ini adalah bagian berikutnya dari auto-rigger kami: memberikan joint dan gerakan sekunder tersendiri kepada rambut. Kami memulai dengan mesh uji sederhana, lalu beralih ke dua avatar sungguhan. Hal itu mengubah implementasi sekaligus apa yang kami ukur.
Pertama, bangun ulang kuncir kuda sungguhan
Seed-san memiliki mesh kuncir kuda terpisah. Untuk pengujian ini, kami menghapus skin weight asli mesh tersebut, menempelkannya ke kepala, lalu meminta fitter geometris kami membuat rantai rambut baru dengan enam joint. Bagian karakter lainnya mempertahankan skinning aslinya. Tujuh rantai poni pendek juga mempertahankan weight buatan artisnya.
Fitter mengikuti permukaan rambut yang terhubung ke arah luar dari akarnya, menempatkan joint di sepanjang jalur tersebut, lalu memadukan pengaruh joint di sekitarnya. Sebuah pita kecil di titik sambungan tetap tersemat. Ini adalah alur kerja rumpun terpilih: kami menentukan mesh mana yang merupakan rambut. Sistem ini tidak menemukan setiap helai secara otomatis pada karakter sembarang.
Coba kuncir kuda di bawah ini. Gunakan Gerakan rambut untuk beralih antara solver sebelumnya dan solver yang telah diperbaiki dalam satu pratinjau. Pilih Bergerak, lalu tenang untuk melihat rambut kembali diam. Jeda untuk memeriksa pose, atau seret pratinjau untuk mengorbit. Pemilih Animasi menyediakan seluruh 260 animasi Universal. Pilih klip untuk melihat seluruh tubuh bergerak; Pembingkaian → Tampilan dekat rambut mengembalikan kamera ke helaian rambut. Uji putaran kepala kembali ke perbandingan terkontrol.
Kami menghapus ransel dan lengan robot Seed-san yang terpisah dari tampilan ini agar kuncir kudanya tidak terhalang. Tubuh, geometri rambut, skin weight, dan animasi tidak diubah oleh perubahan visibilitas tersebut; ini bukan perbaikan tabrakan dengan ransel.
Coba pustaka animasi Universal
Pemilih animasi menggunakan retargeter ruang dunia yang sama dengan rigger dan runtime Cinevva. Kami memetakan metadata humanoid VRM setiap avatar ke nama joint yang diharapkan retargeter, memilih skin tubuh alih-alih skin khusus rambut sebelumnya, dan merekam pose tubuh tanpa animasi sebelum demonstrasi rambut dimulai. Ini mencegah kepala yang menoleh atau posisi berjongkok dianggap sebagai pose istirahat karakter saat klip lain dipilih.
Klip yang dipilih diambil dari pustaka Universal bersama, di-retarget satu kali, lalu diputar pada karakter yang dipilih. Perpindahan horizontal dihapus agar karakter tetap terlihat. Setiap animasi Universal yang dipilih diputar berulang dalam demo ini, termasuk aksi yang awalnya ditandai sebagai sekali putar. Mulai ulang memutar kembali aksi yang dipilih. Gerakan rambut dijalankan setelah animasi tubuh.
Kami melakukan retarget pada seluruh 260 klip untuk setiap avatar: 520 keluaran, tanpa joint tubuh wajib yang hilang, track numerik tidak valid, maupun track animasi tubuh yang menargetkan joint rambut. Kami juga mengambil sampel Idle, Walk, Jump, Back Flip, Dance, Crouch Forward, dan Sitting Idle, memeriksa gerakan dan sinkronisasi tubuh, serta meninjau pose hasil render. Pemeriksaan ini membuktikan retargeting yang dapat digunakan pada kedua rig ini, bukan kesempurnaan visual pada setiap frame. Hasil pemeriksaan retargeting.
Pakaian juga memerlukan kontrol buatannya. Sampel VRM ini menggunakan constraint aim dan twist untuk deformasi lengan baju dan anggota tubuh; menganimasikan joint humanoid saja membuat lengan baju tetap berada dalam pose aslinya. Demo kini memuat kontrol tersebut dengan modul constraint node VRM resmi dan memperbaruinya setelah animasi tubuh, sebelum simulasi rambut. Ini mempertahankan rig pakaian yang disediakan; tidak ada simulasi kain yang ditambahkan.
Seluruh pustaka tersedia untuk diperiksa, tetapi pengukuran clipping dan peregangan di bawah tetap menggunakan rangkaian putaran kepala yang terkontrol. Pengukuran tersebut tidak membuktikan bahwa rambut bebas tabrakan dalam setiap gerakan menari, jatuh, atau salto.
Kesalahannya ada pada bentuk istirahat
Rantai joint memerlukan arah untuk kembali ke posisi semula. Solver kami sebelumnya menghitung arah tersebut relatif terhadap joint di atasnya yang sudah menekuk. Karena itu, defleksi kecil di bagian atas mengubah arah istirahat segmen berikutnya, yang kemudian kembali mengubah segmen setelahnya.
Akumulasi itulah yang menghasilkan gulungan. Mempertahankan panjang yang tepat untuk setiap tulang tidak dapat mencegahnya.
Solver baru mengingat lengkungan asli gaya rambut dalam kerangka koordinat kepala yang bergerak. Setiap segmen tetap memiliki inersia dan redaman, tetapi arah pemulihannya berasal dari bentuk asli tersebut. Kepala dapat berputar sementara rambut tertinggal; ketertinggalan itu tidak lagi menjadi kurva istirahat baru bagi semua bagian di bawahnya.
Kami juga menyetel rig buatan artis yang sudah ada agar sedikit lebih kaku dan meningkatkan redaman. Perbandingan sebelum dan sesudah mencakup penyetelan tersebut, bukan hanya perubahan kerangka koordinat.
Target bergerak yang mempertahankan lengkungan asli
Untuk segmen
Setiap langkah menggabungkan tarikan menuju target ini dengan gravitasi dan redaman eksponensial:
Di sini
Kemudian kami mengembalikan titik ujung ke jarak tetapnya
Proyeksi ini mempertahankan panjang tulang. Proyeksi ini sendiri tidak mempertahankan setiap sisi segitiga maupun menjaga helaian tetap berada di luar pakaian. Implementasi menggunakan arah istirahat jika arah kandidat mengalami degenerasi.
Lalu coba satu gaya rambut utuh
Avatar kedua, sampel dari pixiv, memiliki dua belas rantai rambut dan 12.868 vertex rambut. Di sini kami mempertahankan joint dan weight buatan artis, lalu mengganti perilaku gerakan sekundernya. Contoh ini mendemonstrasikan animasi gaya rambut yang sudah ada, bukan rekonstruksi otomatis mesh rambutnya yang menyatu.
Perhatikan ujung-ujungnya dari samping dan belakang. Versi yang diperbaiki lebih mampu mempertahankan siluet yang dimaksud sambil tetap bergerak. Versi sebelumnya mengumpulkan ujung-ujung rambut menjadi gulungan yang lebih kentara.
Model sungguhan juga mengungkap bug yang lebih samar: beberapa poni pendek berakhir pada node yang bukan merupakan tulang dengan skinning. Kami melewatkan rantai-rantai tersebut. Importer kini menerima titik ujung semacam itu dan membaca rantai rambut kepala yang diberi nama secara eksplisit dari metadata spring VRM 1. Importer juga membaca proksi tabrakan berbentuk bola dan kapsul serta radius tabrakan per joint.
Spesifikasi spring-bone VRM menyediakan struktur pertukaran datanya. Gerakan kami menggunakan solver khusus dengan nilai bawaan yang disetel, bukan implementasi lengkap untuk setiap pengaturan spring VRM. Demo menggunakan loader material MToon dari pixiv untuk shading, tekstur, serta garis luar wajah dan pakaian buatan artis. Kami menonaktifkan shell garis luar rambut yang diperluas karena shell tersebut berpotongan dengan permukaan berlapis yang tipis ini. Kedua pengaturan gerakan menggunakan pencahayaan dan material yang identik. Implementasi spring-bone three-vrm dari pixiv merupakan acuan mapan untuk ekosistem tersebut.
Mengapa rambut depan menembus kemeja
Memeriksa posisi joint saja melewatkan kegagalan yang terlihat jelas: helaian di antara dua joint dapat menembus bahu meskipun kedua ujungnya berada di luar bentuk tabrakannya. Kami juga menemukan kesalahan pengindeksan dalam penanganan radius VRM: membaca radius joint berikutnya membuat radius segmen terakhir menjadi nol.
Dua rambut depan kini menggunakan pemeriksaan tabrakan di sepanjang seluruh segmen. Sebuah tahap fitting bersama mengukur geometri tubuh dan pakaian yang terlihat di sekitar bentuk tabrakan yang ada, dengan batas perluasan berdasarkan ukuran tubuh. Jangkauan, posisi, dan kepemilikan skin weight helaian menentukan rantai mana yang memerlukan pemeriksaan segmen. Kedua avatar kini menggunakan algoritma ini tanpa aturan berdasarkan nama model atau nama helaian. Memperluas pemeriksaan tabrakan ke seluruh gaya rambut meningkatkan peregangan, sehingga constraint sambungan kepala dan poni pendek tetap menggunakan perlakuan aslinya.
Kami memeriksa hasilnya terhadap kemeja yang benar-benar sudah di-skin, secara terpisah dari proksi tersebut. Selama satu siklus putaran kepala, kemeja menyembunyikan hingga 555 dari 1.503 vertex rambut depan dengan gerakan sebelumnya. Fitting otomatis mencatat nol benturan yang melampaui ambang pengukuran 1 mm, baik pada 30 maupun 120 frame per detik. Kedalaman maksimum yang diukur sebelumnya adalah 75,2 mm. Ini adalah pengukuran oklusi dari tampak depan, bukan klaim tabrakan permukaan yang sempurna atau jaminan untuk setiap animasi. Unduh pengukuran rambut depan.
Menjaga rambut depan tetap di luar kemeja memiliki konsekuensi: peregangan persentil ke-99 pada gaya rambut berlapis meningkat dari 17,1% sebelum fitting tabrakan menjadi 18,0%. Angka ini masih berada di bawah 26,0% milik solver sebelumnya; tabel di bawah mencerminkan hasil terkini.
Respons kontak memerlukan koreksi terpisah: mendorong helaian keluar dari pakaian sebelumnya diubah menjadi kecepatan, sehingga menimbulkan pantulan yang terlihat pada langkah berikutnya. Kini kami mengatasi tumpang tindih tanpa menambahkan impuls tersebut, menghapus gerakan masuk saat terjadi kontak, dan mempertahankan gerakan meluncur. Regresi helaian diam memeriksa kontak titik ujung maupun seluruh segmen: helaian yang telah dikoreksi tetap berada pada posisi kontak alih-alih terlempar menjauh.
Kontak di sepanjang helaian, tanpa impuls pantulan
Tautan rambut dan sumbu kapsul sama-sama merupakan segmen garis. Nyatakan titik-titiknya sebagai
Agar koreksi posisi tidak berubah menjadi pantulan, kami merekonstruksi kecepatan sebelum mendorong titik ujung keluar dari kontak:
Setelah koreksi kontak bukan nol, misalkan
Gerakan tangensial tetap bertahan sehingga helaian dapat meluncur. Koreksi posisi itu sendiri tidak ditambahkan ke kecepatan. Solver mengulangi proyeksi kontak dan kemudian menghapus kecepatan di sepanjang arah radial tautan; constraint yang saling berinteraksi masih dapat menyisakan tumpang tindih.
Back Flip mengungkap celah cakupan lain pada kuncir kuda yang dibangun ulang: skin rambutnya yang terpisah tidak memuat tulang torso. Penemuan collider kini menelusuri hierarki tubuh, dan fitter bersama menambahkan kapsul torso ketika cakupan batang tubuh tidak tersedia. Pemeriksaan Back Flip selama enam detik pada 30 dan 120 frame per detik tidak menemukan penetrasi sampel tautan kuncir kuda ke dalam kapsul tersebut. Ini adalah pemeriksaan tabrakan proksi, bukan jaminan terhadap setiap segitiga pakaian; pemeriksaan deformasi putaran kepala yang asli tetap lolos.
Gerakan cepat juga memerlukan pemeriksaan di antara pose. Demo kini memajukan tubuh, constraint pakaian, dan rambut secara bersamaan pada 120 langkah per detik, serta memeriksa helaian terhadap proksi bola dan kapsul yang bergerak di antara langkah-langkah tersebut. Kontak mempertahankan gerakan meluncur ke samping alih-alih menghentikan seluruh helaian, yang jika tidak dilakukan akan membuat rambut menempel. Walk dan Back Flip pada kedua avatar menghasilkan posisi dan kecepatan rambut sampel yang identik pada 30, 60, dan 120 frame per detik dalam pemeriksaan empat detik kami. Ini menangani gerakan primitif yang diambil sampelnya; ini bukan deteksi tabrakan berkelanjutan terhadap setiap segitiga pakaian, dan constraint tambahan masih dapat menyisakan kontak yang belum teratasi. Unduh pemeriksaan frame rate dan kontak. Konsistensi tersebut ada harganya. Dalam tolok ukur dua tampilan sebelumnya pada 60 frame per detik, waktu pembaruan persentil ke-95 yang tercatat sekitar 1 md untuk Seed-san dan 14–23 md untuk model berlapis, tidak termasuk rendering. Biaya tersebut mencakup dua karakter, sedangkan demo langsung kini merender satu karakter. Kasus berlapis masih perlu dioptimalkan; pengukuran desktop ini belum membuktikan performa di ponsel.
Penyesuai masih menggunakan asumsi anatomis dan perluasan terbatas. Penyesuai mempertahankan pengaturan buatan kreator ketika peran tulang atau geometri yang diperlukan tidak tersedia, serta melaporkan transformasi yang tidak didukung. Delapan pemeriksaan tambahan mencakup tulang yang diganti namanya, perubahan skala, ketebalan pakaian, aksesori tersembunyi, dan pemulihan pengaturan asli. Kedua avatar ini digunakan untuk penyetelan; pengujian gaya rambut dan pakaian yang belum pernah diuji tetap diperlukan sebelum hasilnya dapat dianggap andal secara umum.
Ukur mesh, bukan hanya kerangka
Tulang dapat mempertahankan panjangnya sementara segitiga di sekitarnya meregang. Karena itu, kami mengukur setiap sisi segitiga rambut selama pengujian dua belas detik: empat detik gerakan kepala, diikuti delapan detik proses kembali stabil. Simulasi berjalan pada 120 langkah per detik; pengukuran mesh diambil 30 kali per detik.
Untuk setiap sisi, kami mencatat peregangan terburuknya selama pengujian. Tabel ini menampilkan persentil ke-99 dari nilai maksimum per sisi tersebut: 99% sisi tetap berada pada atau di bawah tingkat peregangan itu.
Untuk sisi mesh
| Pengujian model nyata | Gerakan sebelumnya | Gerakan yang ditingkatkan |
|---|---|---|
| Seed-san: ekor kuda yang dibuat ulang beserta poni asli | 8,0% | 5,0% |
| Seed-san: rig rambut asli | 7,6% | 5,1% |
| pixiv: rig rambut berlapis asli | 26,0% | 18,0% |
Sisi individual terburuk tetap penting. Pada model berlapis, hasilnya meningkat dari peregangan 102,7% menjadi 70,8%—sebuah kekurangan yang masih tersisa dan tidak boleh disembunyikan oleh persentil. Sisi terburuk Seed-san membaik dari 35,2% menjadi 27,8% dalam kedua kasus. Ini adalah pengukuran pada contoh pengembangan yang kami gunakan untuk penyetelan, bukan tingkat keberhasilan pada gaya rambut yang belum pernah diuji.
Akar rantai tetap tidak bergerak. Pada dua detik terakhir, gerakan ujung yang diukur di antara frame sampel berada di bawah 0,001 mm dalam setiap kasus yang ditingkatkan. Tiga belas pengujian terfokus mencakup rigging, akar tetap, pemertahanan bentuk, tabrakan, titik ujung pendek, impor, dan kepemilikan animasi. Kami juga menguji penerapan dan pembatalan rig di penampil, serta ekspor animasi berulang dan sekali putar.
Unduh hasil pengukuran. Contoh langsung menggunakan kode solver yang sama dengan penampil dan jalur ekspor prototipe. Contoh tersebut merupakan render interaktif, bukan video rekaman.
Hal yang kini dimungkinkan—dan yang belum teratasi
Untuk ekor kuda atau seikat rambut yang terpisah, kini kami memiliki alur dari geometri terpilih hingga joint, weight, dan gerakan sekunder. Untuk rig rambut kompatibel yang sudah ada, kami dapat mempertahankan karya artis dan menganimasikannya. Ketika animasi sudah memiliki track untuk joint rambut tersebut, solver prosedural mengutamakan gerakan buatan kreator alih-alih menambahkan gerakan kedua di atasnya.
Tolok ukur rambut numerik menggunakan gerakan menoleh dan pergeseran tubuh yang lembut. Pemilih Universal memungkinkan pembaca memeriksa aksi lain, tetapi pengukuran tersebut belum membuktikan kualitas rambut saat berlari, melompat, atau berguling. Proksi tabrakan bukanlah tabrakan penuh terhadap permukaan tubuh, dan kami juga belum menangani tabrakan rambut dengan dirinya sendiri. Kepang, ikal, area rambut yang menyatu, dan performa nyata di ponsel memerlukan pengujian tersendiri.
Fitur ini masih bersifat eksperimental. Namun, pemeriksaan pada karakter nyata membuat peningkatannya terlihat jelas: rambut dapat bergerak tanpa terus-menerus mengubah bentuk yang seharusnya menjadi bentuk kembalinya.
Kredit model. Seed-san © VirtualCast, Inc., dari koleksi sampel VRM resmi. VRM1_Constraint_Twist_Sample © 2022 pixiv Inc., dari model contoh three-vrm. Kedua berkas menyertakan metadata VRM Public License 1.0 yang mengizinkan distribusi ulang dan modifikasi. Ekor kuda yang dibuat ulang dan gerakan khusus merupakan perubahan kami. URL sumber dan hash berkas menunjukkan sampel persis yang digunakan.
Kredit animasi. Klip Universal dibuat oleh Quaternius, dari Universal Animation Library dan Universal Animation Library 2, yang disediakan dengan lisensi CC0.
Berikutnya: rambut pakai ulang pada karakter hasil generasi
Tindak lanjut kami dimulai dengan mesh pustaka tanpa rig: sesuaikan 46 gaya rambut pada seekor katak dan periksa panduan helai yang diekstrak. Eksperimen langsung tersebut memisahkan pelekatan kulit kepala dari fisika yang masih akan dikembangkan.