Skip to content

İskeleti değil, yüzeyi çözün ​

Cinevva CTO'su ve Kurucu Ortağı Oleg Sidorkin tarafından

1. Bölüm, on iki CC0 hayvan üzerinde dört otomatik rigleyiciyi sanatçı rig'leriyle karşılaştırdı ve ortak bir kusur buldu: hepsi neredeyse dümdüz bacaklara sahip dört ayaklı rig'leri oluşturuyor. Bölüm, rig'leri onarma planıyla sona erdi; çünkü bükülmeyen bir bacak, yeniden hedefleme ne kadar iyi olursa olsun sanatçının diz açısını yeniden üretemez.

Ardından, sonuçları tartışırken daha basit bir soru ortaya çıktı. Animasyonu neden iskeletler arasında taşıyoruz ki?

İskelet, bir yüzeyi deforme eden makinedir. Oyuncunun gördüğü şey yüzeydir ve sanatçı klibi, bu yüzeyin her karede, köşe noktası köşe noktası tam olarak nerede olması gerektiğini zaten bize söyler. Öyleyse iskeletten iskelete eşlemeyi tamamen atlayalım. Sanatçı klibini bir kez oynatıp deforme olmuş mesh'i kaydedelim, ardından otomatik riglenmiş iskeletin dönüşümlerini, kendi skinning işlemi bu yüzeyi olabildiğince yakından yeniden üretecek şekilde çözelim. Sonuç, yeni rig'in uzayında doğal olarak yaşayan bir kliptir. Kemiklerinin adı isterse bone_0 olsun, bizim için fark etmez.

İşlem hattı şeması: sanatçı klibinden deforme olmuş yüzeye, kare başına çözümden rig'in kendi uzayındaki klibe
Tüm işlem hattı. Burada hiçbir şey bir kemiği diğerine eşlemiyor; böylece 1. bölümün büyük kısmını tüketen karşılık bulma sorunu ortadan kalkıyor.

Bu, literatürde yeni bir fikir değil. Skinning ayrıştırmasının dönüşüm yarısı, Le ve Deng'in 2012 tarihli SSDR yöntemi ve hareket yakalama çözücülerinin yoğun işaretçilere rastgele rig'leri uydurma biçimi budur. Bizim durumumuz kolay olanı: rigleyici iskeleti ve ağırlıkları zaten sağladı, dolayısıyla bilinmeyen tek şey kare başına kemik dönüşümleri.

Yöntem ve onu dürüst tutan kontrol ​

Her karede, rig'in skinning uygulanmış yüzeyi ile hedef yüzey arasındaki mesafeyi en aza indiren, kemik başına bir dönüşüm arıyoruz. Ağırlıklar sabitken her kemiğin en iyi dönüşümünün kapalı biçimli bir çözümü vardır: Horn'un kuaterniyon yöntemiyle ağırlıklı rijit uyum. Doğrusal harmanlamalı skinning, ortak köşe noktaları üzerinden kemikleri birbirine bağlar; bu nedenle artık değer değişmeyi bırakana kadar kemikleri sırayla tarar, her çözümde diğer tüm kemiklerin mevcut katkısını hesaba katarız. Her kare, önceki kareden sıcak başlatılır.

Her şey, dosyanın hangi kurallarla dışa aktarıldığından bağımsız olarak skinning özdeşliğinin tam tuttuğu bind uzayında çalışır. Sanatçı mesh'i ile rigleyicinin yeniden kaynaklanmış veya alt bölümlere ayrılmış mesh'i arasındaki karşılıklar, hizalanmış dinlenme pozlarında en yakın komşu yöntemiyle bulunur; her ikisi de aynı hayvan olduğu için burada sonuç tamdır.

En önemli tasarım kuralı şuydu: sonucu mutlaka sıfır çıkması gereken bir kontrol çalıştırması. Sanatçı rig'ini kendi klibine karşı çözüyoruz; burada kusursuz bir yanıtın var olduğu daha en baştan kesin. Çözücü bunu bulamıyorsa ürettiği başka hiçbir şeyin anlamı yoktur. Kontrol, model köşegeninin %0,008'ine ulaşıyor; en kötü tek köşe noktası ise %0,08'de. Diğer her şeyin ölçüldüğü taban budur.

Güvenilir bir sıfıra ulaşmak üç deneme aldı ​

İlk kontrol çalıştırması %3'te takıldı ve otuz kat daha fazla iterasyona rağmen ilerlemedi. Nedenlerini kaydetmeye değer, çünkü her biri dışarıdan görünmezdi.

En büyük sorun bir API tuzağıydı. three.js'in yeni sürümleri boneTransform adını applyBoneTransform olarak değiştirdi ve yaptığı işi sessizce farklılaştırdı: yeni fonksiyon, girdi konumunu ilettiğiniz vektörden alıyor ve geometriyi hiçbir zaman okumuyor. Yeniden kullanılan geçici bir vektör verildiğinde her köşe noktasını bir önceki köşe noktasının çıktısından hesaplıyor. Ortaya çıkan hedefler akıcı ve makul görünen saçmalıktı; hatta utanç verici bir saat boyunca, sayılara kusursuzca uyan ama tamamen hayal ürünü olan ayrıntılı bir armatür ölçeği teorisini desteklediler. Doğru giriş noktası getVertexPosition. Kontrol bunu yakaladı; zaten kontrolün var olmasının bütün gerekçesi de bu.

Diğer ikisi daha küçüktü. Horn matrisindeki kuvvet iterasyonu, yakınsamayı sağlayan spektral kaydırma aynı zamanda yakınsamanın izlediği aralığı da ezdiği için yaklaşık derecenin binde birinde takılıyor; bu nedenle 4x4 için kesin sonuç veren Jacobi döndürmelerine geçtik. Ayrıca göreli ilerlemeye dayalı erken çıkış testi, taramalar hâlâ aşağı doğru ilerlerken onları donduruyordu; dolayısıyla çıkış artık modelin ölçeğine göre mutlak ilerlemeyi ölçüyor.

Her rigleyicinin gerçekte taşıyabildiği miktar ​

Çözücüyü doğruladıktan sonra iki sanatçı klibini, Walk ve Gallop'u, tüm rigleyicilerin desteklediği altı hayvanın her bir rig'ine çözümledik. Puan, rig'in yeniden ürettiği yüzey hareketi yer değiştirmesinin oranıdır. Artık zihnimizde bir adı var: aktarım kalitesi.

Walk ve Gallop için rigleyici bazında aktarım kalitesi nokta grafiği; sanatçı kontrolü yüzde 100'e, RigNet yüzde 50'ye yakın
Kalite = 1 − çözümlenmiş artık değer / hareket büyüklüğü; altı hayvanın ortalaması. Kontrol satırı, kendi klibine karşı çözümlenen sanatçı rig'idir.
rigWalkGallop
sanatçı (kontrol)99.8%99.9%
Anything World94.4%91.9%
Tripo92.3%89.1%
SkinTokens, sanatçı iskeleti verildiğinde82.5%89.4%
SkinTokens80.9%88.0%
RigNet48.5%58.3%

Şimdi bunu 1. bölümle karşılaştırın, çünkü sıralama tersine dönüyor.

RigNet, dört rigleyici arasında en iyi bacak bükülmesine sahipti ve iskeletleri on iki hayvanın tamamında kontrol edilebilirlik eşiğimizi geçen tek rigleyiciydi. Buradaysa yürüyüşün yarısını kaybediyor. En kötü köşe noktaları, yüzeyin olması gereken yerden modelin %20 ila %31'i kadar uzakta kalıyor ve bu başarısızlık altı hayvanın tamamında tutarlı: her birinde kalite %38 ila %59 arasında. Buna karşılık, ölçtüğümüz en düz bacaklı iki rig olan Tripo ve Anything World, animasyonu en iyi taşıyanlar.

Açıklaması, dile getirildiğinde basit. Çözümlenmiş bir klip eklemleri yalnızca döndürmekle kalmayıp öteleyebilir ve eklem başına öteleme izleri sıradan, geçerli animasyon verileridir. Öteleme mevcut olduğunda düz bir zincir yine de bükülen bir yüzeyi takip edebilir; dolayısıyla bükülme artık kısıtlayıcı etken olmaktan çıkar. Bunun yerine belirleyici olan, skinning ağırlıklarının mesh'i kemikleri düzgünce izleyen parçalara ayırıp ayırmadığıdır. Ticari rigleyicilerin ağırlıkları iyi. RigNet'in düzensiz zincirlerine yayılmış ağırlıklarıysa çözücü kemikleri nereye taşırsa taşısın yüzeyi takip edemiyor.

Dolayısıyla iki ölçüm, iki farklı soruyu yanıtlıyor. Bükülme oranı, döndürmeyle sürülen bir çalışma zamanı rig'inin hangi pozları verebileceğini belirler; bu, 1. bölümün dünyasıdır. Aktarım kalitesi ise fırınlanmış, çözümlenmiş bir klibin ne kadarını ifade edebileceğini belirler; bu da bu bölümün dünyasıdır. Çözümlenmiş klip işlem hattında hâlihazırda kullandığımız rigleyici, sonuncu olmak yerine %92'lik bir rig'dir.

Bu tabloda gizlenen bir sonuç daha var: SkinTokens'a sanatçının kendi iskeletini vermek puanını neredeyse hiç değiştirmiyor. Tavanını eklem yerleşimi değil, ağırlıkları belirliyor.

Güvenmek yerine izlemek ​

Önce sayılar, sonra gözler. Aynı çözücü, her rig'in tam mesh'inin çözümlenmiş dönüşümleriyle skinning uygulandığı, sanatçının referans yüzeyinin üzerine koyu bir silüet olarak çizildiği ve her köşe noktasının anlık hatasına göre renklendirildiği canlı bir görüntüleyiciyi çalıştırıyor. Mavi sıfırdır. Kırmızı, model köşegeninin %3'ü veya daha kötüsüdür.

Walk, her rig'e çözümlenmiş hâliyle. Soldan sağa: sanatçının referans sonucu, Tripo, Anything World, SkinTokens, RigNet. RigNet'in bacakları kıpkırmızı yanıyor ve her adımda silüetten kopuyor. %48 böyle görünüyor.
Gallop her rig'i daha fazla zorluyor. Tam uzama anında arka bacaklara bakın: Tripo ve Anything World dayanırken RigNet dağılıyor.

Görüntü ile tablo birbirinden sapamaz, çünkü görüntüleyici metriğin ölçtüğü fonksiyonun aynısıyla render alıyor. Bir panel için açıklama gerekiyor: SkinTokens geyiğinde ısı haritası gösterilmiyor. Mesh'i 181.000 köşe noktasına sahip ve 60.000'in üzerinde tam mesh karşılık bulma işlemini atlıyoruz; dolayısıyla bu panel yalnızca silüet üzerinden kanıt sunuyor.

Bunun bizim için değiştirdikleri ​

Bir çözümleme, tarayıcıdaki JavaScript ile, GPU kullanılmadan, klip ve rig başına yarım saniye ile birkaç saniye sürüyor. Bu, dört ayaklı bir karakterin tüm klip setini rig oluşturulduğu anda fırınlayabilecek kadar ucuz. Fırınlanmış klipler çalışma zamanını da basitleştiriyor: hayvanlar için artık hiç iskelet yeniden hedeflemesi yok; yalnızca rig'in kendi uzayında klip oynatımı ve zemin teması için bunun üzerine mevcut ayak sabitlememiz.

Bu aynı zamanda bize ikinci bir kabul eşiği sağlıyor. 1. bölümdeki geometrik kontroller, bir rig'in kontrol edilebilir olup olmadığını söylüyor. Aktarım kalitesi ise gerçek bir animasyonun ne kadarını koruyacağını gösteriyor. Bir rigleyici ilkini geçip ikincisinde kalabilir ve RigNet tam olarak bunu yapıyor.

Sınırlar, açıkça ifade edersek ​

Puan, her rig'in tavanıdır; bir vaat değildir. Çözücü eklemleri öteleyebilir, bu nedenle hareket sırasında kemik uzunlukları korunmaz ve ötelemeye fazla yaslanan bir rig uç pozlarda lastiksi görünebilir. İyi rig'lerde bile anlık olarak %9 ila %20'ye ulaşan Gallop'un en kötü köşe noktaları tam olarak bu anlarda ortaya çıkıyor. Çözümün yalnızca döndürme kullanan bir çeşidi bunun bedelini dürüstçe ortaya koyar ve hâlâ hesaplamamız gereken sayı budur: öteleme devre dışı bırakıldığında 1. bölümdeki düz bacak cezasının ne kadarının kaldığını gösterir.

Üretimdeki eksik halka, karşılık bulmadır. Bu kıyaslamada rigleyici, sanatçının animasyon uyguladığı mesh'in aynısını rigledi; bu nedenle köşe noktası eşleştirmesi basitti. Kullanıcının yüklediği hayvan farklı bir mesh'tir ve sanatçının yüzey hareketini önce ona aktarmak, henüz ölçmediğimiz bilinen yöntemleri bulunan başlı başına ayrı bir problemdir.

Bir de örneklem var: altı hayvan, iki klip, klip başına 24 kare ve en yoğun mesh'te beş bin köşe noktasına indirgenmiş kısıtlar. Rigleyicileri güvenle sıralamak için yeterli, ikinci bir ondalık basamak vermek için yetersiz.

Hayvanlar Quaternius kaynaklı CC0 varlıklardır; yöntem, kırk yıllık kapalı biçimli uyum ile sabrın birleşimidir ve bunu yeniden üretmek isteyen herkese ilk olarak kontrol çalıştırmasını kurmalarını öneririz. Daha önce animasyonu rig'lere çözümlediyseniz ve bizim karşılaştığımız tuzaklarla ya da farklı olanlarla karşılaştıysanız Discord sunucumuzda notlarımızı karşılaştırmak isteriz.