Skip to content

Saç sallanmalı, dokunaca dönüşmemeli ​

Yazan: Oleg Sidorkin, Cinevva CTO'su ve Kurucu Ortağı

Kızın katmanlı saçının yan yana karşılaştırması: solda önceki hareket, sağda iyileştirilmiş hareket.

Bir karakter başını çeviriyor. Saçı bir an sonra onu takip etmeli, biraz sallanmalı ve ardından durulmalı. İlk sürümümüz ise başka bir şey yapıyordu: Saç uçları, saç modeli dokunaca dönüşmeye çalışıyormuş gibi içe doğru kıvrılıyordu.

Kemikler uzunluklarını koruyordu. Simülasyon kararlıydı. İzlediğimiz sayısal kontroller geçiyordu. Ama hareket yine de yanlış görünüyordu.

Bu, otomatik rig aracımızın bir sonraki parçası: saça kendi eklemlerini ve ikincil hareketini kazandırmak. Basit bir test mesh'iyle başladık, ardından iki gerçek avatara geçtik. Bu geçiş hem uygulamayı hem de ölçtüğümüz şeyleri değiştirdi.

Önce gerçek bir at kuyruğunu yeniden oluşturun ​

Seed-san'ın ayrı bir at kuyruğu mesh'i var. Bu test için o mesh'in özgün skin ağırlıklarını sildik, onu başa bağladık ve geometrik uydurucumuzdan altı eklemli yeni bir saç zinciri oluşturmasını istedik. Karakterin geri kalanı özgün skinning'ini korudu. Yedi kısa perçem zinciri de sanatçı tarafından hazırlanmış ağırlıklarını korudu.

Uydurucu, bağlı saç yüzeyini kökünden dışarı doğru izler, eklemleri bu yol boyunca yerleştirir ve yakındaki eklem etkilerini harmanlar. Bağlantı noktasındaki küçük bir bant sabit tutulur. Bu, seçili tutamlarla çalışan bir iş akışıdır: Hangi mesh'in saç olduğunu ona biz söyleriz. Herhangi bir karakterdeki her saç telini kendiliğinden keşfetmez.

Aşağıdaki at kuyruğunu deneyin. Tek bir önizlemede önceki ve iyileştirilmiş çözücü arasında geçiş yapmak için Saç hareketi seçeneğini kullanın. Saçın durulmasını izlemek için Hareket et, sonra durul seçeneğini belirleyin. Bir pozu incelemek için duraklatın veya kamera çevresinde dönmek üzere önizlemeyi sürükleyin. Animasyon seçicisi, 260 Universal animasyonun tamamını sunar. Tüm vücudun hareketini görmek için bir klip seçin; Kadraj → Saç yakın planı kamerayı yeniden saç tellerine getirir. Baş çevirme testi kontrollü karşılaştırmaya geri döner.

Open this demo in a full window ↗

At kuyruğunun önü kapanmasın diye Seed-san'ın ayrı sırt çantasını ve robot kolunu bu görünümlerden kaldırdık. Bu görünürlük değişikliği gövdeyi, saç geometrisini, skin ağırlıklarını veya animasyonu değiştirmez; bu bir sırt çantası çarpışma düzeltmesi değildir.

Universal animasyon kütüphanesini deneyin ​

Animasyon seçicisi, Cinevva'nın rig aracı ve çalışma zamanı ile aynı dünya uzayı retargeter'ını kullanır. Her avatarın VRM insansı metadata'sını retargeter'ın beklediği eklem adlarıyla eşleştiriyor, daha önceki yalnızca saça ait skin yerine gövde skin'ini seçiyor ve saç gösterimi başlamadan önce gövdenin animasyonsuz pozunu kaydediyoruz. Böylece başka bir klip seçildiğinde çevrilmiş bir başın veya çömelmiş bir pozun karakterin dinlenme pozu olarak ele alınmasını önlüyoruz.

Seçilen klip, paylaşılan Universal kütüphanesinden alınır, bir kez retarget edilir ve seçili karakter üzerinde oynatılır. Karakteri görünümde tutmak için yatay ilerleme kaldırılır. Başlangıçta tek seferlik olarak işaretlenmiş eylemler de dahil olmak üzere, seçilen tüm Universal animasyonlar bu demolarda döngü halinde oynatılır. Yeniden başlat, seçili eylemi baştan oynatır. Saç hareketi, gövde animasyonundan sonra çalışır.

260 klibin tamamını her avatar için retarget ettik: Toplam 520 çıktı üretildi ve hiçbirinde gerekli gövde eklemi eksik değildi, geçersiz sayısal track yoktu veya saç eklemlerini hedefleyen gövde animasyonu track'i bulunmuyordu. Ayrıca Idle, Walk, Jump, Back Flip, Dance, Crouch Forward ve Sitting Idle animasyonlarını örnekledik; gövde hareketini ve senkronizasyonu kontrol ettik ve render edilmiş pozları inceledik. Bu kontroller, her karede görsel kusursuzluk değil, bu iki rig üzerinde kullanılabilir retargeting sağlandığını gösterir. Retargeting kontrol sonuçları.

Giysilerin de sanatçı tarafından hazırlanmış kontrollerine ihtiyacı vardır. Bu VRM örneği, kollar ve uzuv deformasyonu için aim ve twist kısıtlamaları kullanır; yalnızca insansı eklemleri canlandırmak, kolları özgün pozlarında bırakır. Demo artık bu kontrolleri resmî VRM düğüm kısıtlaması modülüyle yükler ve gövde animasyonundan sonra, saç simülasyonundan önce günceller. Bu, sağlanan giysi rig'ini korur; bir kumaş simülasyonu eklemez.

Kütüphanenin tamamı incelemeye açıktır, ancak aşağıdaki kırpışma ve esneme ölçümleri hâlâ kontrollü baş çevirme dizisini kullanır. Bunlar her dans, düşme veya takla animasyonunda saçın çarpışmasız olduğunu göstermez.

Hata dinlenme şeklindeydi ​

Bir eklem zincirinin geri dönmek için bir yöne ihtiyacı vardır. Önceki çözücümüz bu yönü, üstündeki zaten bükülmüş ekleme göre hesaplıyordu. Bu nedenle üst taraftaki küçük bir sapma, sonraki segmentin dinlenme yönünü değiştiriyor; bu da bir sonraki segmenti yeniden değiştiriyordu.

Bu birikim kıvrılmayı oluşturuyordu. Her kemiğin doğru uzunluğu koruması bunu engelleyemiyordu.

Yeni çözücü, saç modelinin özgün yayını hareket eden başın koordinat sisteminde hatırlar. Her segment hâlâ eylemsizlik ve sönümlemeye sahiptir, ancak geri çağırıcı yönü bu özgün şekilden gelir. Baş dönerken saç geride kalabilir; ancak bu gecikme artık altındaki her şey için yeni bir dinlenme eğrisine dönüşmez.

Ayrıca mevcut sanatçı rig'lerini biraz daha sert olacak şekilde ayarladık ve sönümlemeyi artırdık. Önce-sonra karşılaştırması yalnızca koordinat sistemi değişikliğini değil, bu ayarları da içerir.

Özgün yayı koruyan hareketli bir hedef ​

i segmenti için oi mevcut eklem konumu, ai ise özgün child ofseti olsun. Geri dönmeye çalıştığı konum şöyledir:

ri=oi+RHRi0(sai).

RH, zincirin bağlantı sisteminin, genellikle başın, animasyonlu dönüşüdür. Ri0, bu sistemden söz konusu segmente kadar birikmiş özgün dönüşü; s ise model ölçeğini ifade eder. Eklem konumu zinciri izler, ancak hedef yön kaydedilmiş yaydan gelir. Bu yön için zaten bükülmüş parent'ın dönüşünü kullanmak, kıvrılmanın birikmesine neden oluyordu.

Her adım, bu hedefe doğru çekimi yerçekimi ve üstel sönümlemeyle birleştirir:

ui=e−ch[vi+hfi],fi=k(ri−xi)+g,yi=xi+hui.

Burada xi simüle edilen uç nokta, vi onun hızı, k geri çağırma katsayısı, c sönümleme oranı ve g çözücünün kullandığı yerçekimi ivmesidir. Demo, gövde ve saç hareketini birlikte h=1/120 saniyede örnekler. Bu, örtük birim kütleye sahip özel bir yay güncellemesidir; eksiksiz bir elastik çubuk veya XPBD çözücüsü değildir.

Ardından uç noktayı, eklemden Li=s‖ai‖ sabit uzaklığına geri yerleştiririz:

x^i=oi+Liyi−oi‖yi−oi‖.

Bu projeksiyon kemik uzunluğunu korur. Tek başına her üçgen kenarını korumaz veya saç telini giysinin dışında tutmaz. Aday yön dejenere olursa uygulama dinlenme yönünü kullanır.

Ardından bütün bir saç modelini deneyin ​

İkinci avatar olan pixiv örneğinde on iki saç zinciri ve 12.868 saç vertex'i bulunuyor. Burada sanatçının eklem ve ağırlıklarını koruyor, yalnızca ikincil hareket davranışını değiştiriyoruz. Bu örnek, mevcut bir saç modelinin animasyonunu gösterir; birleşik saç mesh'inin otomatik olarak yeniden oluşturulmasını değil.

Open this demo in a full window ↗

Uçlara yandan ve arkadan bakın. İyileştirilmiş sürüm, hareketi korurken amaçlanan silüetin daha büyük bölümünü muhafaza eder. Önceki sürüm ise uçları daha belirgin bir kıvrımda toplar.

Gerçek modeller daha az göze çarpan bir hatayı da ortaya çıkardı: Bazı kısa perçemler, kendisi skin uygulanmış bir kemik olmayan bir düğümde sonlanıyordu. Bu zincirleri atlıyorduk. İçe aktarıcı artık bu uç noktaları kabul ediyor ve VRM 1 yay metadata'sından açıkça adlandırılmış baş saçı zincirlerini okuyor. Ayrıca küre ve kapsül çarpışma proxy'lerini ve eklem başına çarpışma yarıçaplarını da okuyor.

VRM'nin spring-bone spesifikasyonu veri alışverişi yapısını sağlar. Hareketimiz, her VRM yay ayarının eksiksiz bir uygulaması değil, ayarlanmış varsayılanlara sahip özel bir çözücüdür. Demolar, sanatçı tarafından hazırlanmış gölgelendirme, dokular ve yüz/giysi konturları için pixiv'in MToon materyal yükleyicisini kullanır. Genişletilmiş saç konturu kabuklarını devre dışı bırakıyoruz çünkü bu kabuklar ince, katmanlı yüzeylerle kesişiyor. Her iki hareket ayarı da aynı aydınlatma ve materyalleri kullanır. pixiv'in three-vrm spring-bone uygulaması, bu ekosistem için yerleşik bir referanstır.

Öndeki saç tutamları neden tişörtün içinden geçti? ​

Yalnızca eklem konumlarını kontrol etmek görünür bir hatayı gözden kaçırdı: İki eklem arasındaki saç teli, her iki ucu da çarpışma şeklinin dışında olsa bile omuzun içinden geçebiliyordu. VRM yarıçaplarını işlememizde bir indeksleme hatası da bulduk: Sonraki eklemin yarıçapını okumak, son segmentin yarıçapını sıfır yapıyordu.

Öndeki iki saç tutamı artık her segmentin tamamı boyunca çarpışma kontrolleri kullanıyor. Paylaşılan bir uydurma geçişi, mevcut çarpışma şekillerinin çevresindeki görünür gövde ve giysi geometrisini, gövde boyutuna dayalı genişletme sınırlarıyla ölçüyor. Saç telinin erişimi, konumu ve skin ağırlığı sahipliği, hangi zincirlerin segment kontrollerine ihtiyaç duyduğunu belirliyor. Artık her iki avatar da model adına veya saç teli adına özel kurallar olmadan bu algoritmayı kullanıyor. Çarpışma kontrollerini saç modelinin tamamına yaymak esnemeyi artırdığı için, baş bağlantısı kısıtlamaları ve kısa perçemler özgün işleme biçimlerini koruyor.

Sonucu, bu proxy'lerden bağımsız olarak gerçek skin uygulanmış tişört üzerinde kontrol ettik. Bir baş çevirme döngüsü boyunca tişört, önceki hareketle öndeki saç tutamlarının 1.503 vertex'inden 555'ini gizliyordu. Otomatik uydurma, hem saniyede 30 hem de 120 karede 1 mm'lik ölçüm eşiğinin ötesinde sıfır temas kaydetti. Daha önce ölçülen maksimum derinlik 75,2 mm idi. Bu, önden görünümde yapılan bir örtülme ölçümüdür; kusursuz yüzey çarpışması iddiası veya her animasyon için garanti değildir. Ön saç tutamı ölçümlerini indirin.

Saç tutamlarını tişörtün dışında tutmanın bir bedeli var: Katmanlı saç modelinin 99. yüzdelik dilimdeki esnemesi, çarpışma uydurmasından önceki %17,1 değerinden %18,0'a yükseldi. Yine de önceki çözücünün %26,0'lık değerinin altında kalıyor; aşağıdaki tablo mevcut sonucu yansıtır.

Temas tepkisi ayrı bir düzeltme gerektirdi: Bir saç telini giysinin dışına itmek hıza dönüştürülüyor ve sonraki adımda görünür bir geri sıçramaya neden oluyordu. Artık bu itkıyı eklemeden çakışmayı çözüyor, temas anında içeri yönelen hareketi kaldırıyor ve kayma hareketini koruyoruz. Dinlenen saç teli regresyonu hem uç nokta hem de tam segment temasını kontrol ediyor: Düzeltilmiş saç teli uzağa fırlamak yerine temas konumunda kalıyor.

Geri sıçrama itkisi olmadan saç teli boyunca temas ​

Bir saç bağlantısı ve kapsül ekseni, ikisi de doğru parçalarıdır. Noktalarını u,v∈[0,1] olacak şekilde p(u) ve q(v) olarak yazalım. Aralarındaki boşluk şöyledir:

d=minu,v∈[0,1]‖p(u)−q(v)‖,C=d−(rb+rh).

rb gövde proxy'sinin yarıçapı, rh ise saçın çarpışma yarıçapıdır; ikisi de dünya birimlerindedir. Negatif C, çakışma olduğu anlamına gelir. Yalnızca child uç noktasını kontrol etmek u=1 değerini sabitler ve uzun bir tutamın ortasını gözden kaçırabilir; segment teması tüm aralıkta arama yapar. Küre, kapsül ekseninin sıfır uzunluğa sahip olduğu özel durumdur.

Konum düzeltmesinin sıçramaya dönüşmesini önlemek için, uç noktayı temasın dışına itmeden önce hızı yeniden oluşturuyoruz:

vi∗=x^i−xih.

Sıfırdan farklı bir temas düzeltmesinden sonra n, düzeltmenin normalize edilmiş yönü olsun. Yalnızca bu düzeltmenin içine doğru hareket eden bileşeni kaldırırız:

vi+=vi∗−min(0,vi∗⋅n)n.

Teğetsel hareket korunur, böylece saç teli kayabilir. Konum düzeltmesinin kendisi hıza eklenmez. Çözücü temas projeksiyonunu tekrarlar ve ardından bağlantının radyal yönündeki hızı kaldırır; etkileşen kısıtlamalar yine de artık çakışma bırakabilir.

Back Flip, yeniden oluşturulan at kuyruğunda farklı bir kapsama boşluğunu ortaya çıkardı: Ayrı saç skin'i gövde kemiklerini içermiyordu. Çarpıştırıcı keşfi artık gövde hiyerarşisini tarıyor ve paylaşılan uydurucu, gövde kapsamının eksik olduğu yerlere bir torso kapsülü ekliyor. Hem saniyede 30 hem de 120 karede yapılan altı saniyelik Back Flip kontrolünde, örneklenen hiçbir at kuyruğu bağlantısının bu kapsülün içine girmediği görüldü. Bu bir proxy çarpışma kontrolüdür; her giysi üçgenine karşı garanti değildir. Özgün baş çevirme deformasyon kontrolleri hâlâ geçmektedir.

Hızlı hareketler, pozların arasındaki kontrolleri de gerektirir. Demo artık gövdeyi, giysi kısıtlamalarını ve saçı birlikte saniyede 120 adımla ilerletiyor ve bu adımlar arasında saç tellerini hareket eden küre ve kapsül proxy'lerine karşı kontrol ediyor. Temas, tüm saç telini durdurmak yerine yana doğru kaymayı korur; aksi hâlde saç yapışıyordu. Dört saniyelik kontrollerimizde her iki avatarın Walk ve Back Flip animasyonları, saniyede 30, 60 ve 120 karede aynı örneklenmiş saç konumlarını ve hızlarını üretti. Bu, örneklenmiş primitive hareketini işler; her giysi üçgenine karşı sürekli çarpışma algılama değildir ve ek kısıtlamalar yine de çözülemeyen temaslar bırakabilir. Kare hızı ve temas kontrollerini indirin. Bu tutarlılığın bir bedeli var. Saniyede 60 kare hızındaki önceki iki görünümlü karşılaştırmada, işleme hariç kaydedilen 95. yüzdelik dilim güncelleme süresi Seed-san için yaklaşık 1 ms, katmanlı model içinse 14–23 ms idi. Bu maliyetler iki karakteri kapsıyordu; canlı demo artık tek karakter işliyor. Katmanlı senaryonun hâlâ optimize edilmesi gerekiyor; masaüstünde alınan bu ölçümler telefon performansını ortaya koymuyor.

Uyarlayıcı hâlâ anatomik varsayımlar ve sınırlı genişletme kullanıyor. Gerekli vücut rolleri veya geometri eksik olduğunda tasarlanmış ayarları koruyor ve desteklenmeyen dönüşümleri bildiriyor. Yeniden adlandırılmış kemikler, ölçek değişiklikleri, giysi kalınlığı, gizli aksesuarlar ve özgün ayarların geri yüklenmesi için sekiz ek kontrol bulunuyor. Ayarlamalar bu iki avatarla yapıldı; sonucun genel olarak güvenilir olduğunu söyleyebilmek için daha önce görülmemiş saç stilleri ve giysiler üzerinde test yapılması gerekiyor.

Yalnızca iskeleti değil, ağı da ölçün ​

Bir kemik uzunluğunu korurken çevresindeki üçgenler esneyebilir. Bu nedenle on iki saniyelik bir çalışma boyunca her saç üçgeni kenarını ölçtük: dört saniye baş hareketi, ardından sekiz saniye durulma. Simülasyon saniyede 120 adım çalışıyor; ağ ölçümleri saniyede 30 kez örnekleniyor.

Her kenar için çalışma sırasındaki en yüksek esneme değerini kaydediyoruz. Tablo, kenar başına bu maksimum değerlerin 99. yüzdelik dilimini gösteriyor: Kenarların %99'u bu esneme miktarında veya altında kaldı.

Özgün uzunluğu ℓe0 olan e=(a,b) ağ kenarı için skin uygulanmış za(t) ve zb(t) tepe noktası konumlarını ölçüyoruz:

ρe(t)=‖za(t)−zb(t)‖ℓe0,me=maxt∈Tρe(t).

T, örneklenen kareleri içerir. Bildirilen yüzde 100(Q0.99({me})−1) değeridir; burada Q0.99, kenarlar arasındaki 99. yüzdelik dilimdir. Yüzdelik dilimi hesaplamadan önce her kenarın maksimumunu almak, zaman ortalamasının gizleyebileceği kısa süreli esneme olaylarını korur. En kötü kenar değeri bunun yerine maxeme kullanır; böylece küçük ama ciddi biçimde deforme olmuş bir bölge raporda görünür kalır.

Gerçek model testiÖnceki hareketİyileştirilmiş hareket
Seed-san: yeniden oluşturulmuş at kuyruğu ve özgün perçemler%8,0%5,0
Seed-san: özgün saç rigi%7,6%5,1
pixiv: özgün katmanlı saç rigi%26,0%18,0

En kötü tekil kenar hâlâ önemli. Katmanlı modelde %102,7'den %70,8 esnemeye geriledi; bu, yüzdelik dilimin gizlememesi gereken, hâlâ mevcut bir kusur. Seed-san'ın en kötü kenarı her iki durumda da %35,2'den %27,8'e geriledi. Bunlar, ayarlama sırasında kullandığımız geliştirme örnekleri üzerindeki ölçümlerdir; daha önce görülmemiş saç stillerindeki başarı oranı değildir.

Zincir kökleri sabit kaldı. Son iki saniyede, örneklenen kareler arasında ölçülen uç hareketi iyileştirilmiş her durumda 0,001 mm'nin altındaydı. Rigleme, sabit kökler, şekil koruma, çarpışmalar, kısa uçlar, içe aktarma ve animasyon sahipliğini kapsayan on üç odaklı test bulunuyor. Ayrıca görüntüleyicide rigin uygulanmasını ve geri alınmasını, döngüsel ve tek seferlik animasyonların dışa aktarılmasını da kontrol ettik.

Ölçümleri indirin. Canlı örnekler, prototipin görüntüleyici ve dışa aktarma yoluyla aynı çözücü kodunu kullanıyor. Bunlar önceden kaydedilmiş videolar değil, etkileşimli işlemelerdir.

Bunun mümkün kıldıkları ve henüz çözmedikleri ​

Ayrı bir at kuyruğu veya saç tutamı için artık seçili geometriden eklemlere, ağırlıklara ve ikincil harekete uzanan bir yolumuz var. Mevcut ve uyumlu bir saç riginde sanatçının çalışmasını koruyup canlandırabiliyoruz. Bir animasyon bu saç eklemleri için zaten izler içeriyorsa prosedürel çözücü, üzerine ikinci bir hareket uygulamak yerine tasarlanmış harekete öncelik veriyor.

Sayısal saç karşılaştırmasında baş dönüşleri ve hafif gövde ötelemesi kullanılıyor. Universal seçici, okuyucuların diğer aksiyonları incelemesine olanak tanıyor ancak bu ölçümler koşma, zıplama veya yuvarlanma sırasında saç kalitesini ortaya koymuyor. Çarpışma vekilleri tam vücut yüzeyi çarpışması değildir ve henüz saçın kendi kendisiyle çarpışmasını çözmüyoruz. Örgüler, bukleler, birleşik saç bölgeleri ve telefonlardaki gerçek performans için ayrı testler gerekiyor.

Özellik deneysel olmaya devam ediyor. Ancak gerçek karakterler üzerinde yapılan kontroller iyileştirmeyi somutlaştırdı: Saç, geri dönmesi gereken şekli sürekli yeniden yazmadan hareket edebiliyor.


Model katkıları. Seed-san © VirtualCast, Inc.; resmî VRM örnek koleksiyonundan. VRM1_Constraint_Twist_Sample © 2022 pixiv Inc.; three-vrm'in örnek modellerinden. Her iki dosya da yeniden dağıtım ve değişikliğe izin veren VRM Public License 1.0 meta verilerini içeriyor. Yeniden oluşturulan at kuyruğu ve özel hareket, bizim değişikliklerimizdir. Kaynak URL'leri ve dosya karmaları, kullanılan örnekleri kesin olarak tanımlar.

Animasyon katkıları. Universal klipleri Quaternius tarafından hazırlanmış, Universal Animation Library ve Universal Animation Library 2 koleksiyonlarından alınmış ve CC0 kapsamında sunulmuştur.

Sırada: oluşturulmuş bir karakter için yeniden kullanılabilir saç ​

Devam çalışmamız riglenmemiş kütüphane ağlarıyla başlıyor: 46 saç stilini bir kurbağaya uyarlayın ve çıkarılan saç teli kılavuzlarını inceleyin. Canlı deney, saç derisine bağlanmayı ileride eklenecek fizikten ayırıyor.