Skip to content

Rigleyicinin kemik vermediği kuyrukları canlandırmak ​

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

11 Eylül 2026'da güncellendi: farenin bize öğrettikleri elastik bükülmeleri, zemin temasını ve kuyruğun yol açtığı ikinci bir gövde yükselmesi türünü ele alıyor.

Bir kullanıcı, antropomorfik bir tilkiyi rigleyicimizde rigledi ve Walk klibini oynattı. Gövde sorunsuzdu. Kuyruk, ıslak bir havlu gibi sol bacağa kıvrılmıştı ve sol ile sağ bacak ağırlıklarının birleştiği yerde yırtılıyordu. Aşağıdaki örnek boyunca bu tilkiyi kullanıyoruz; düzeltme artık hem rigleyicide hem de klipleri oynatan çalışma zamanı kütüphanesinde yayında.

Bu makaledeki tilki ve fare, 3B model oluşturucumuzla üretildi, ardından Cinevva'da riglenip canlandırıldı.

Arkadan görülen, yürüyen bir tilkinin üç kopyası: kuyruğu sol bacağın çevresine kıvrılmış özgün rig, dümdüz aşağı sarkan rijit bir kuyruk ve yukarıda ve geride taşınan kemik zincirli bir kuyruk

Soldan sağa, aynı karede adımın ortasında: rigleyiciden çıktığı hâliyle rig, kuyruğun tek parça olarak pelvise bağlandığı aynı rig ve çalışma zamanında sallanan, kendi kemik zincirine sahip kuyruk. Üçünün de çevresinde aşağıda dönebilirsiniz.

İnsansı bir rigleyici bunu neden yapar? ​

Fast motorumuz, sabit bir Mixamo tarzı iskelet öngören Make-It-Animatable üzerine kuruludur: 22 gövde kemiği veya parmaklarla birlikte 65 kemik. Mesh'teki her köşe bu kemiklerden birine atanmalıdır. Kuyruk listede olmadığından model, bildiği en iyi ikinci seçeneği uygular ve kuyruğun köşelerini, öğrendiği özellik uzayında en yakın olan gövde parçasına verir. Bu tilkide söz konusu parça sol kaval kemiğiydi; kalan kısım ise iki uyluk arasında bölünmüştü.

Bu, ağırlıklardaki bir hata değildir. Şablonun kendisidir. Hiçbir istem veya ayar modelin kuyruk kemiği üretmesini sağlayamaz, çünkü üretebileceği bir kuyruk kemiği yoktur. Aynı şey kanatlarda, pelerinlerde, uzun saçlarda ve gövdeden sarkan diğer her şeyde yaşanır.

Herhangi bir değişiklik yapmadan önce bunun tilkinin kuyruğundaki 1.582 köşeye maliyetini ölçtük. Her köşenin onu gerçekten hareket ettiren kemiklere uzaklığı, ağırlıklarla ağırlıklandırıldığında, 191 cm boyundaki bir modelde ortalama 47 cm çıktı. Kuyruk yarım metre uzaktan hareket ettiriliyordu.

Kuyruğu bulmak ​

Bu aşamada elimizde yalnızca riglenmiş GLB var ve ihtiyacımız olan da bu. İşlem yalnızca bizimkinin değil, herhangi bir rigleyicinin çıktısı üzerinde çalışır.

İskelet üzerinde bir uzaklık alanı. Her p köşesi ve bind uzayında a ekleminden b eklemine uzanan her kemik parçası için parçaya olan uzaklık şöyledir:

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

Bir köşenin iskelet uzaklığı, tüm parçalar arasındaki minimum değerdir. Yaprak eklemler, eklemin ötesinde kısa bir uzantıya sahip olur; böylece burun veya el, kendi kemiğinden uzakta sayılmaz. Bu uzaklık model boyunun %7'sini aştığında köşe uzak kabul edilir. Tilkide bu değer 13 cm'dir.

Uzak derinin bağlantılı parçaları. Uzak köşeler, mesh'in kendi yüzleri boyunca bağlantılı bileşenler hâlinde gruplanır. Bir ayrıntı bize bir saate mal oldu: dışa aktarıcılar köşeleri UV ve sert normal dikişlerinde böler. Bu nedenle bu mesh'te 23.129 köşe olmasına rağmen yalnızca 29.081 üçgen var ve tek başına yüz grafiği bir kuyruğu onlarca adacığa ayırıyor. Önce köşeleri konumlarına göre kaynatıyor, bağlantıyı kaynatılmış grafik üzerinde çalıştırıyor ve ağırlıkları özgün köşe başına geri yazıyoruz.

Nereye bağlanıyor? Bir parçanın yakası, ona komşu olan uzak olmayan köşelerin halkasıdır. Merkezinden, en yakın ekleme göre parçanın nereden sarktığını anlarız; ancak bir yanlılık uygularız: en yakın uzaklığın 1,5 katı içinde bulunan bir gövde veya uyluk eklemi tercih edilir. Çünkü pelvis çevresinde uyluk başları kalçalara tam olarak aynı uzaklıktadır ve aralarında bulunan bir kuyruk kökü gövdeye aittir. Bunun için yakanın ağırlıklarına özellikle güvenmiyoruz. Ayrı bir kabuk olarak modellenmiş kuyruklarda (oyun modellerinin çoğu böyledir) yaka, kuyruğun kendi kök halkasıdır ve düzeltmeye çalıştığımız aynı hatalı ağırlıkları taşır.

Bu bir uzuv mu, yoksa gövde mi? İki test uyguluyoruz. Kalın bir gövdenin kemikten uzaktaki derisi kemiğin çevresini sarar, dolayısıyla kütle merkezi yeniden kemiğin üzerine düşer. Kuyruk ise bir yana doğru uzanır, dolayısıyla kütle merkezi her kemikten uzaktadır. Ağırlık merkezinin iskelet uzaklığının, parçanın erişiminin en az %40'ı olmasını şart koşuyoruz. Ardından bir şekil testi gelir: λ1≥λ2, parça kovaryansının en büyük iki özdeğeri olmak üzere uzama değeri λ1/λ2 olur. Burada kuyruk yaklaşık 2,6 puan alırken pelerin veya etek 1'e yakın sonuç verir. Yalnızca pelvisten sarkan uzun parçalar zincire dönüşür. Omurgadan sarkan uzun parçalar (kın, sadak veya kayış) vücudun bir uzantısı değil, taşınan nesnelerdir ve bağlandıkları kemikle birlikte rijit biçimde hareket eder. Kafadan sarkan kulaklara dokunulmaz: kafayla birlikte rijit hareket etmek, kulakların tam olarak ihtiyaç duyduğu davranıştır.

Tilkinin kuyruğu üst üste binen iki kabuk olarak çıktı (derinin üzerinde kürk vardı ve hiç kaynatılmamışlardı). Bu nedenle aynı bağlantıdaki sınırlayıcı kutuları yarıdan fazla örtüşen parçalar birleştirilir. Tek kuyruk, tek zincir.

Birinci adım: rijit hâle getirmek ​

İlk dürüst düzeltme bir öğleden sonra sürer. Parçanın her köşesine Hips üzerinde 1,0 ağırlık verilir. Kuyruk yırtılmayı bırakır ve pelvisle birlikte tek parça hâlinde hareket eder. Bir kalas gibi görünür; görseldeki ortadaki tilki budur. Bunu bir kilometre taşı olarak yayınladık, çünkü yapısı gereği esneme değeri tam olarak sıfırdır ve aşağıdaki ölçüm için kullanışlı bir referans oluşturur.

İkinci adım: boyunca bir zincir oluşturmak ​

Kuyruk boyunca bir koordinat. Mesh kenarlarını kenar uzunluklarıyla ağırlıklandırarak yakadan parçanın içine doğru Dijkstra algoritmasını çalıştırıyoruz. Her kuyruk köşesi, kökten itibaren bir jeodezik uzaklık g alıyor ve g değerinin 99. yüzdelik dilimi kuyruk uzunluğu L oluyor: tilki için 81 cm, yani boyunun %42'si.

Eklemler. Parça sayısı K=clamp(round(L/0.1H),3,8) olup tilki için dörttür. J0 eklemi yakanın ağırlık merkezidir; Ji eklemi ise jeodezik uzaklığı iL/K değerinin yarım parça mesafesi içinde kalan derinin ağırlık merkezidir. Ji←12Ji+14(Ji−1+Ji+1) işleminin iki kez uygulanması, enine kesitin dengesiz olduğu yerlerde zincirin zikzak çizmesini engeller; gür bir kuyruğun ucu her zaman böyledir. Kemikler, Tail_1 ile Tail_K arasındaki kemiklerin yanı sıra ağırlıksız bir Tail_End kemiğinden oluşur. Hips altında ebeveynlenirler ve Hips bind rotasyonunu paylaşırlar; böylece her biri ebeveyninin çerçevesinde saf bir öteleme olur. Ters bind matrisleri doğrudan buradan elde edilir ve mevcut klipler bunlardan hiç söz etmediği için devamındaki hiçbir şey bozulmaz.

Ağırlıklar. s=Kg/L, k=⌊s⌋ ve f=s−k olmak üzere, k parçasındaki bir köşe k+1 kemiğine aittir ve uçları komşularıyla paylaşır:

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

Bir eklemde iki kemik 50/50 oranında buluşur; parçanın ortasında ise kemiğin biri deriye tamamen sahip olur. Kök parçasında "prev", Hips'tir; böylece kuyruk yakada kırışmak yerine gövdeye yumuşak biçimde karışır.

İşlemden sonra kuyruktaki ağırlıklandırılmış kemik uzaklığı 47 cm'den 17 cm'ye düştü; bu yaklaşık olarak kuyruğun kendi yarıçapıdır. Derinin, kendisini hareket ettiren kemiğe yaklaşabileceği mesafe budur.

İskeleti mesh'in üzerinde çizilmiş yürüyen tilkinin yandan görünümü; dört kuyruk kemiği pelvisten kuyruk boyunca uzanıyor ve kuyruğu yukarıda ve geride taşıyor

Üçüncü adım: kemikleri bir şeyin hareket ettirmesi gerekir ​

Kütüphanemizdeki hiçbir klip kuyruk izi içermiyor; dolayısıyla ek bir işlem yapılmazsa zincir bind pozunu korur ve tilki bir kalasla dolaşır. Oyunlar bunu prosedürel ikincil hareketle çözer; biz de aynısını, riglenmiş her modelin zaten yüklediği çalışma zamanı kütüphanesinde yapıyoruz.

Her eklem ucu, hızı v olan bir p parçacığıdır. Dinlenme hedefi T, bind pozuna göre ucun bulunması gereken konumdur ve her karede ebeveyn kemiğin geçerli dünya dönüşümünden hesaplanır. Parçacık sönümlü bir yayı izler:

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

Burada ω=2πf olur. Kök parça f=0.9 Hz frekansında, uç ise bunun yarı frekansında sallanır; çünkü kuyruk dibinde kas, ucunda kürktür. Başlangıçtaki sönüm oranı ζ=0.45 idi; aşağıdaki fare güncellemesi aşımı azaltmak için bunu 0.65 değerine yükseltiyor. Yerçekimi 9,8 değil, 1 m/s²'dir; kuyruğun içinde kas vardır. Yarı örtük Euler yöntemiyle integrasyon yapıyor, ardından p değerini kemik başının çevresinde kemik uzunluğu yarıçaplı küreye geri yansıtarak ip kısıtını uyguluyoruz. Bir ip esneyemez; dolayısıyla üzerindeki hız da esneyemez: radyal bileşen (p˙⋅n^)n^ atılır, salınım korunur. Son olarak kemiğin rotasyonu geri okunur: bind yönünü parçacığa uzanan yöne taşıyan quaternion.

Parçacıklar dünya uzayında bulunduğu için kalçaların dönmesi veya hızlanması kuyruğun geride kalmasına ve kendi başına sallanmasına yol açar. Hiçbir şey betiklenmemiştir.

Burada üç hatayı itiraf etmeye değer; çünkü her biri bir şey ölçülene kadar sorunsuz görünüyordu.

İlk sürüm, her parçacığı her karede hedefe olan mesafenin sabit bir oranı kadar, 60 fps'de %12, hedefe çekiyordu. Yay olarak yazıldığında bu ω≈0.12/Δt≈21 rad/s, yani 3,4 Hz'lik bir titreşimdir. Bu sertlik kök parçaların hareket etmesine neredeyse hiç izin vermediği için tüm hareket uçta birikiyordu. Yayı fiziksel birimlerle yazmak her iki sorunu da aynı anda çözdü.

İkinci sürüm, ip düzeltmesini hız olarak, yani düzeltmenin Δt değerine bölünmüş hâliyle geri besliyordu. Bu, standart konum tabanlı dinamik güncellemesi gibi görünür ve kalçalar yavaş hareket ettiği sürece kararlıdır; yürüyüş döngüsü de böyledir. Ebeveyn ne kadar hızlı hareket ederse düzeltme o kadar büyür ve sisteme enjekte ettiği hız da o kadar artar. Saniyenin üçte ikisinde yarım metrelik bir kalça salınımı yeterliydi: bir kemik 95° dönerken komşuları 3° hareket etti. Kalçaları yayınladığımız tüm kliplerden daha sert sallayan başsız bir test bunu yakaladı; yürüyüş döngüsü asla yakalayamazdı.

Üçüncü hata aşağıdaki taşıma açısıydı. Bu açı her eklemin kendi çerçevesinde uygulanıyordu; dolayısıyla dört kemikli bir kuyruk dört kez yükseliyor, tilkinin sırtına dayanıp top gibi kıvrılıyor ve her bükülmede kendi derisini yırtıyordu. Bunu aşağıdaki ölçüm ortaya çıkardı: kuyruk kenarlarının esneme değeri p99'da 2,3'e çıkmıştı; gövde tabanı ise 1,3'tü. Yani başladığı kaval kemiği durumundan daha kötüydü. carry artık tüm kuyruğun yükselme miktarıdır ve eklemler arasında paylaşılır.

Kesişme. Kuyruk, bacakların arasında dümdüz aşağı sarkacak şekilde modellenmişti ve yürüyüş döngüsünde ayaklar içinden geçiyordu. Bu nedenle yayın hedeflediği dinlenme pozu mesh'in kendi pozu değildir: 50°'lik bir carry, dinlenme hedeflerini kalçaların yan ekseni çevresinde arkaya ve yukarı kaldırır; tıpkı hareket eden bir tilkinin kuyruğunu taşıması gibi. Bu 50°, tüm kuyruğun yükselme açısıdır ve eklemler arasında paylaşılır; böylece zincir ister dört ister sekiz kemik uzunluğunda olsun, yay yumuşak kalır. Ayrıca hiçbir parçacık, kuyruk kökünden geçen ve öne bakan düzlemi aşamaz; böylece kuyruk asla bacakların arasına sallanamaz.

Ölçüm ​

Bunlar, aşağıdaki fare değişikliklerinden önce 6 Eylül'de alınan özgün tilki ölçümleridir. Güncellenmiş varsayılanların yeni bir karşılaştırmalı testi değil, ilk zincir çözücünün kaydıdır.

Sabit görseller yırtılma konusunda hiçbir şeyi kanıtlamaz; bu nedenle klip sırasında kenar esnemesini ölçüyoruz. İki köşesi de kuyrukta bulunan her mesh kenarı için, Walk klibi boyunca eşit aralıklı 24 anda skinlenmiş uzunluğun bind uzunluğuna oranını alıyoruz. 1 oranı, deforme olmamış deri demektir. 1,5'in üzerinde uzayan veya 0,67'nin altında sıkışan bir kenar yırtılmış sayılır. Normal skinning deformasyonunun nasıl göründüğüne dair bir taban değer elde etmek için gövde kenarları da aynı şekilde ölçülür.

Walk klibi, 96.864 kuyruk kenarı örneğip95p99maks.yırtılmış
Özgün rig1.602.424.0311.4%
Hips'e rijit bağlı1.001.001.000%
Kuyruk zinciri1.091.181.300%
Referans olarak gövde1.131.291.78—

Özgün rig, her dokuz kuyruk kenarından birini yırtılma sınırının ötesine uzatıyordu ve en kötü kenar bind uzunluğunun dört katına çıkıyordu. Zincirdeki en kötü kenar %30 uzuyor; bu değer gövdenin kendi 1,78'lik taban değerinin içinde kalıyor ve hiçbir şey yırtılmıyor. Rijit kuyruk tek parça hâlinde hareket ettiği için tam olarak 1,00 değerinde kalıyor. Zincirdeki sonuca güvenmeden önce test düzeneğinin doğru çalıştığını bize gösteren sayı buydu.

Gerçekten sallanan bir kuyruğun kendi derisini bir miktar deforme etmesi gerekir. Dolayısıyla zincirin görevi 1,00'a ulaşmak değil, gövdenin zaten yaptığı deformasyonun altında kalmaktır. Bu tablonun önceki bir sürümünde zincir için 1,03'lük bir p99 değeri gösteriliyordu; bu daha iyi görünse de aslında daha kötüydü: yukarıdaki hız hatası kuyruğu aşırı sönümleyerek rijit sürüme yakın hâle getirdiğinden kuyruk neredeyse hiç hareket etmiyordu.

Canlı karşılaştırma ​

Tilkinin üç kopyası; aynı klip, aynı kare. Çevresinde dönmek için sürükleyin, yakınlaştırmak için tekerleği kullanın. Klipler arasında geçiş yapın, zinciri taşınan dinlenme pozunda görmek için kuyruk fiziğini kapatın ve zincirin nerede durduğunu görmek için kemikleri açın.

Aynı zincir yandan, tek başına ve iskeleti çizilmiş hâlde. Yay etkisini en iyi gösteren klip Sprint'tir.

Farenin bize öğrettikleri ​

Tilki, bir zincirin yırtılmayı durdurabileceğini gösterdi. Uzun ve ince kuyruklu bir fare, geriye kalan hareket hatalarını görmeyi çok daha kolaylaştırdı. Tilkinin kürkü içinde kaybolan keskin bir bükülme, farede kırık bir eklem gibi görünür. Farenin kuyruğu ayrıca zemine kadar uzanıyor ve modellenen şekli bir yana doğru kıvrılıyor. Bunlar üç ayrı sorun; yay sertliğini artırmak hepsini çözmüyor.

Aşağıdaki animasyon kitaplığında fareyi farklı animasyonlarla deneyin. Kamerayı döndürmek için karakteri sürükleyin, küçük resim şeridini yana kaydırın ya da bir hareket bulmak için arama ve kategori filtresini kullanın. Büyük önizlemede oynatmak için bir kutucuğa tıklayın. Kuyruğu incelerken Walk, Crouch Backward, Crawl Idle ve Back Flip iyi başlangıç noktalarıdır. Şerit, animasyonlar ana bölümümüzdeki canlı animasyon önizlemelerinin aynısını kullanır ve siz göz atarken hareketleri yükleyerek tüm kataloğu erişilebilir kılar.

Bu hareketleri kendi iskeletli karakterinizde denemek ve seçtiğiniz klipleri dışa aktarmak için tam animasyon kitaplığını açın →.

Bir yay zincirinin yine de bükülme direncine ihtiyacı vardır ​

Parçacıklar, her kemiğin uzunluğunu koruyacak şekilde kısıtlanmıştı ancak her eklem hâlâ neredeyse bağımsız olarak sallanabiliyordu. Uzunluk kısıtlamaları esnemeyi önler; bir menteşenin katlanmasını önlemez. Fare tam olarak bu ayrımı ortaya çıkardı.

Artık komşu eklemlerin, dinlenme eğrisine göre ölçülen ilave bükülmelerini birbirine bağlıyoruz. Bükülmeler ortak bir referans çerçevesinde karşılaştırılıyor; böylece farklı kemik eksenleri, sola doğru bir bükülmeyi bir sonraki eklemde alakasız bir burulmaya dönüştürmüyor. Her adım, kısmen güncellenmiş değerler yerine komşularının anlık görüntüsünü okuyor. Bağlama harmanı, işlenen kare başına sabit bir oran yerine saniyede varsayılan k=12 oranıyla 1−e−kΔt olarak hesaplanıyor.

Bir eklemin elastik bükülmesi, dinlenme yönünün 30° ötesiyle sınırlandırılıyor. Ayrıca sönümlemeyi 0.65'e çıkardık ve bükülme sınırına doğru itmeyi sürdüren hızı kaldırdık; böylece bu hız birikip ani bir sıçrama olarak açığa çıkamıyor. Taban kalçalardan destek almaya devam ederken uç kısım daha yumuşak kalıyor. Kuyruğun zemine uzanması gerektiğinde temas, bükülme sınırını geçersiz kılabiliyor.

Parçacık konumlarını değil, dönüşleri bağlamak. N bağlantıyı kalçalardaki i=0'dan başlayarak numaralandıralım. hi bir bağlantının başlangıcı, pi tahmin edilen ucu ve ℓi uzunluğu olsun. Aday yönü di=(pi−hi)/∥pi−hi∥ olur. Geçerli ebeveynin çerçevesinde ri birim dinlenme yönü, d~i ise aday yön olsun. swing(a,b) ifadesi, a birim vektörünü b birim vektörüne götüren en kısa birim kuaterniyonu göstersin. Ai, bu ebeveynin dinlenme çerçevesini ortak kalça çerçevesine döndürüyorsa komşularla karşılaştırdığımız bükülme şöyledir:

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

Bu eşlenik dönüşüm, bükülmenin koordinat çerçevesini değiştirir; karaktere başka bir dönüş eklemez. Önceki adımdan alınan qjold anlık görüntüleri kullanıldığında, içteki bir eklemin komşu hedefi ve bağlanmış bükülmesi şöyledir:

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

Tabanda komşu hedefi, bir sonraki eklemin bükülmesiyle kalçalardan gelen desteği temsil eden özdeşlik kuaterniyonu I arasındaki orta noktadır. Serbest uç tek komşusunu kullanır; tek bağlantılı bir kuyrukta komşu bağlama işlemi atlanır. k=12s−1 olduğunda α, 60 fps'de yaklaşık 0.181, 30 fps'de ise 0.330'dur. Böylece bağlama zamana dayalı bir orana sahip olur; ancak eksiksiz çözücüde yine de zaman adımına bağlı entegrasyon ve temas hataları bulunur.

Skaler bileşeni wi olan birim kuaterniyon qi∗ için en kısa dönüş açısı θi=2arccos⁡(clamp(|wi|,0,1)) olur. Elastik sınır şöyledir:

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

Bu bükülmeyi tekrar ebeveyn çerçevesine dönüştürüp temas izdüşümlerinden önce ri'ye uyguluyoruz. Bu, tam bir elastik çubuk simülasyonu değil, yerel bir bükülme yumuşatma kuralıdır: genel bir bükülme enerjisini çözdüğünü iddia etmeden ilave eğriliği paylaşır ve sınırlar.

Yüklenen poz, bağlama pozu olmak zorunda değildir ​

Farenin kaydedilmiş dosyasında, son kuyruk ekleminde zaten yaklaşık 28° dönüş vardı. Bu yüklenmiş dönüşü nötr kabul ediyor, ardından üzerine yay hareketini ekliyorduk. Daha önce canlandırılmış veya dışa aktarılmış bir poz, yayın hedefinin kalıcı bir parçasına dönüşmüştü.

Çözücü artık iskeletin ters bağlama matrisleri mevcut olduğunda nötr yerel dönüşümleri bunlardan elde ediyor. Bir iskelette Tail_End yardımcı kemiği yoksa son segment, son kemiğin kendi yerel çerçevesinde ifade edilen gelen teğeti sürdürür. Uç kemik farklı bir yönelime sahip olur olmaz ebeveyn çerçevesinden bir vektör kopyalamak hatalıdır.

Tek taraflı kıvrımın başka bir nedeni daha vardı: gerçek bağlama geometrisinde zaten mevcuttu. Bu nedenle bağlama pozunu doğru şekilde elde etmek sapmayı korudu. Simülasyon artık kalça uzayında oluşturulup düzeltilmiş her ebeveynin çerçevesine dönüştürülen, ortalanmış bir dinlenme yayını varsayılan olarak kullanıyor. restCurve, modellenen kıvrımı yeniden harmanlayabilir: 0 ortalanmış yaydır, 1 ise oluşturulmuş eğriyi korur. Bu, yayların hedefini değiştirir; ağı veya deri ağırlıklarını yeniden yazmaz.

Referans dönüşümlerini elde etmek. Bi, bir kemiğin ters bağlama matrisini göstersin. Bağlama-dünya dönüşümü Wi0=Bi−1 olur; dolayısıyla hem kemik hem de ebeveyn bağlama matrislerine sahip olduğunda nötr yerel dönüşüm şöyledir:

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

Li0 matrisini bileşenlerine ayırmak, ihtiyacımız olan yerel ötelemeyi ve dönüşü verir. Bunun yerine yüklenmiş kuaterniyonu okumak, bu referansın yerine rastgele kaydedilmiş bir animasyon karesini koyardı.

Ortalanmış yayı oluşturmak. ai, i segmentinin kalça uzayındaki oluşturulmuş birim yönü olsun. c=normalize(0,a0y,a0z) değerini elde etmek için kök yönünün yanal bileşenini kaldırır, bu izdüşüm yok olursa aşağı yönü kullanırız. β∈[0,1], restCurve; C ise radyan cinsinden toplam taşıma açısı olsun. rot(q,v), v vektörünün q kuaterniyonuyla döndürülmesini göstermek üzere istenen kalça uzayı yönü şöyledir:

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

Burada Rx, kalçaların yanlamasına uzanan ekseni çevresindeki dönüştür. En önemlisi, Ai üst eklemlere daha önce uygulanmış dinlenme düzeltmelerini içerir. Bu, ui değerini doğrultma düzeltmesini her eklemde yeniden eklemek yerine ilgili segmentin amaçlanan mutlak yönü yapar. β=0 olduğunda modellenen yanal kıvrım kaldırılır; β=1 olduğunda ise taşıma uygulanmadan önce yönleri korunur.

Kuyruk zemine değebilir; fareyi kaldıramaz ​

Zemin teması, bir segmenti uzunluk küresiyle zeminin kesişimine döndürür. Bir parçacığın yüksekliğini basitçe sınırlamak kemiği kısaltır; yüksekliği sınırlayıp ardından uzunluğu geri yüklemek ise kemiği yeniden zeminin altına sokabilir. Kalınlık için merkez çizgisinin altında 0.025 dünya birimi bırakıyor, aşağı yönlü temas hızını atıyor ve kaymayı sönümlüyoruz. Düz zemin varsayılan olarak dünya Y = 0 düzlemindedir; taşınabilir veya devre dışı bırakılabilir. Bu, arazi ya da tam ağ çarpışması değil, bir düzlem kısıtlamasıdır.

Küre-zemin kesişimi. F=g0+ρ, zemin yüksekliği ile merkez çizgisi açıklığının toplamı olsun; burada varsayılan olarak g0=0 ve ρ=0.025 değerindedir. Segment şu koşulları sağlamalıdır:

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

Tahmin edilen uç nokta zeminin altındaysa u=(F−hiy)/ℓi olarak tanımlayalım. |u|≤1 olduğunda temas yatay bir çember üzerindedir. t yatay birim yönse düzeltilmiş uç nokta şöyledir:

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

Yüksekliği tam olarak F, başlangıç noktasına uzaklığı ise tam olarak ℓi olur; çünkü (1−u2)+u2=1'dir. t değerini aday yönün yatay izdüşümünden seçiyoruz; bu izdüşüm yok olursa dinlenme yönünü kullanıyoruz. Kalçaların arkada tutma düzlemi, çemberin hangi kısmına izin verildiğini sınırlayabilir. Temas, elastik bükülme sınırına göre önceliklidir. Başlangıç noktası zeminin o kadar altındaysa ki u>1 oluyorsa bu sabit uzunluklu segment hiçbir dönüşle zemine ulaşamaz; uygulama, kemiği esnetmek veya gövdeyi kaldırmak yerine u değerini sınırlar.

Diğer hız izdüşümlerinden sonra temas eden bir parçacığın kalan aşağı yönlü hızı kaldırılır ve hızı sönümlenir:

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

Bu, Coulomb sürtünme modeli değil, basit sönümlemeli esnek olmayan temastır. Kuyruk zeminde dururken yerçekiminin aşağı yönlü hız biriktirmesini önler.

Bu, kuyruğun zemine girmesi sorununu çözdü; ancak kuyruğun ayakları havada bırakabileceği iki yer daha vardı.

İlk olarak görüntüleyici, yüklenen ağın tamamındaki en alçak noktayı zemine yerleştiriyordu. Kaydedilmiş kuyruk ayak tabanlarının altına sarkıyorsa kuyruğa yer açmak için tüm karakteri yukarı kaldırıyordu. Görüntüleyici artık gövde zeminini bulurken kuyruğun baskın olduğu deriyi yok sayıyor; kamera kadrajı ise karakterin tamamını içermeyi sürdürüyor.

İkinci olarak, yeniden hedefleyicinin gövdeyi zemine oturtma geçişi de kuyruğu hesaba katıyordu. Back Flip sırasında, bağımsız kuyruk çözücü daha sonra bu deriyi hareket ettirecek olsa bile onu zeminden uzak tutmak için pelvisi yükseltiyordu.

Hangi deri pelvisi yükseltebilir? S, gövdenin örneklenmiş deri destek noktaları; T, kuyruk kemiklerinin baskın olduğu noktalar; E ise uzuv temas çözücülerinin denetimindeki noktalar olsun. Referans zemin, kalibrasyon sırasında S∖T üzerinden ölçülür. t karesinde kalan gövde açıklığı şöyledir:

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

Burada a(t)≤0, referans zeminin altına inmek için kaynaktan türetilen toleranstır. Lraw, yeniden hedefleyicinin zamansal yumuşatma ve uzuv uzlaştırması öncesinde istenen kaldırma miktarıdır. Aynı kuyruk dışlama işlemi her iki minimumda da bulunmalıdır: kuyruğu yalnızca geçerli poz sondasından kaldırmak, referans zeminin yine yanlış kalmasına yol açardı. Uygulama, her karede her köşeyi değerlendirmek yerine baskın kemiğe göre gruplandırılmış deri örneklerini kullanır.

Aşağıdaki karşılaştırmada bildirilen ilave kaldırma, yalnızca ham düzeltme değil, nihai pelvis yörüngeleri arasındaki farktır:

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

Back Flip'in sonuna yakın ölçülen pelvis yükselmesi

Aynı fareyi aynı animasyon zamanlarında, kuyruğun gövdeyi zemine oturtma işlemine dahil edilip edilmediğini değiştirerek örnekledik. Her iki sütun da aynı model dünya koordinatlarını kullanır; aradaki fark, kuyruğu hesaba katmanın getirdiği ilave yüksekliği yalıtır.

1.93 sn'lik klipteki zamanPelvis yüksekliği: kuyruk dahilPelvis yüksekliği: kuyruk hariçKuyruğu dahil etmenin getirdiği ilave yükselme
1.16 sn50.5 cm35.0 cm15.4 cm
1.55 sn81.3 cm70.3 cm11.0 cm
1.84 sn92.2 cm77.2 cm15.0 cm
1.93 sn90.6 cm77.2 cm13.4 cm

Karakter, inişten sonra doğrulurken yükselmelidir. Hata, amaçlanan bu toparlanma hareketi değil, son sütundaki ilave yükselmedir. Değerler, örneklenen dünya konumlarından bağımsız olarak yuvarlanmıştır.

Bu farede kuyruğu hariç tutmak, Back Flip'in sonlarına doğru yaklaşık 15 cm'lik ilave pelvis yükselmesini ortadan kaldırdı. Sona yakın gövde sondası, zeminin birkaç santimetre üzerinde süzülmek yerine referans zeminin yaklaşık bir milimetre yakınında kaldı. Kuyruk derisi artık ne gövdenin zeminini ne de pelvisi yükselten düzeltmeyi belirliyor. Kuyruk çözücünün kendisi yalnızca kuyruk kemiklerini döndürür; modeli, kalçaları veya ayakları hiçbir zaman ötelemez.

Bir animasyon, siz onu oynatmadan önce bir pozu devralabilir ​

Yükselmiş çömelme pozu ayrı bir sorunu ortaya çıkardı. Görüntüleyicinin her klip hazır olmadan oynatmaya başlayabilmesi için kitaplık kliplerini aşamalı olarak üretiyoruz. Yeniden hedefleme işlemi, oynatma ile aynı iskeleti kullanıyordu. Çözümler arasında önizleme pelvisi hareket ettirebiliyor ve sonraki klip bu animasyonlu pozu kalibrasyon referansı olarak okuyabiliyordu. Klip değiştirirken sıfırlama yapmak, oluşturulan izlere zaten işlenmiş kötü bir referansı düzeltemiyordu.

Yeniden hedefleme artık oynatma başlamadan önce alınan kararlı bir kalibrasyondan oluşturulmuş özel iskelet kopyaları üzerinde çalışıyor. Sonraki klip istekleri bu referansı yeniden kullanıyor ve eşzamanlı istekler ayrı kemiklere sahip oluyor. Bir regresyon testi, teslim edilen klipler arasında canlı kalçaları kasıtlı olarak hareket ettirip döndürüyor; oluşturulan izlerin temiz bir çalıştırmayla aynı kalması ve çözüm işleminin canlı poza dokunmaması gerekiyor. Görünen her hareket bir hata değildi. Climb Idle’ın kaynak döngüsünde, kök sabitken pelvis hafifçe yukarı aşağı hareket ediyor. Ayrıca yeni bir Crawl Idle çözümünde farenin elleri döngü boyunca başının altında kaldı; ellerin havada olduğu ekran görüntüsü, kaynak animasyonun bu pozu istediğine dair bir kanıt olmaktan ziyade daha önce kirlenmiş bir kliple tutarlıydı. Kaynağı, yeni bir çözümü ve oynatılan sonucu karşılaştırmak, bir kalibrasyon hatasını gizlemek uğruna bilinçli hareketleri düzleştirmemizi önledi.

Artık neleri kontrol ediyoruz ​

Kontroller; farklı uzunluklardaki zincirlerde hızlı kalça salınımlarını, komşu eklemler arasındaki daha yumuşak bükülmeleri, eşit sol/sağ tepkilerini, bind pozuna dönüşü, yardımcı kemiği olmayan döndürülmüş bir uç kemiği ve ısınma sonrasında döngünün kapanmasını kapsıyor. Zemin testleri; çömelmeyi, yükseltilmiş zemin düzlemlerini, kalçalar yükseldiğinde yerleşme ve serbest kalma davranışlarını kapsıyor. Ayrı regresyon testleri, kuyruk temasının gövdeyi hiçbir zaman hareket ettirmediğini ve kuyruk skin’inin pelvisin yükseltilmesini isteyemediğini doğruluyor.

Bu kontroller belirli değişmezleri güvence altına alıyor. Farenin hareketlerini izleyerek değerlendirme yapmanın yerini tutmadıkları gibi, tilki için yeni esneme değerleri de belirlemiyorlar. Canlı örnekler güncellenmiş çözücüyü kullanıyor; önceki tilki tablosu ise ilk ölçümün kaydı olarak kalıyor.

Bu sizin için neyi değiştiriyor? ​

cinevva.com/tools/rigger adresinde kuyruklu bir karakter rig’lerseniz kuyruk kendi kemik zinciriyle birlikte gelir, iş durumu bulunan yapıyı açıklayan bir appendages girdisi içerir ve önizlemede kuyruk sallanır. Platform API’si üzerinden rig’lenen modeller de aynı dosyayı alır. rt/1.1.12 sürümündeki ilk entegrasyon, createAnimator işlevinin Tail_* kemiklerini bulup ek kod gerektirmeden hareket ettirmesini sağladı; daha ağır veya daha ağırkanlı bir kuyruk istiyorsanız yayın frekansı, sönümleme, yerçekimi ve taşıma açısı seçeneklerini değiştirebilirsiniz. Kuyruk zinciri bulunmayan eski dosyalar yeniden rig’lenerek bu işlemden tekrar geçirilebilir. Yukarıda açıklanan 11 Eylül değişiklikleri artık Cinevva’nın web önizlemelerinde yayında. Eski bir çalışma zamanı sürümüne sabitlenmiş oyunlar ve daha önce dışa aktarılmış klipler otomatik olarak güncellenmez. Mevcut bake edilmiş kliplerin düzeltmeleri alması için yeniden oluşturulması gerekir.

Blender’da. Eklenti, armature’ı oluşturmadan önce rig tablosunda aynı işlemi çalıştırır; böylece kendi bilgisayarınızda rig’lediğiniz kuyruk da aynı adlarla aynı zinciri edinir. Fingers seçeneğinin yanında bir Tail onay kutusu bulunur ve sonuç kartı ne bulunduğunu belirtir.

Çalışma zamanımızın dışında. Bir oyundaki yay sistemi, dosyayı Blender, Unity veya Unreal’da açan ve kuyruğu hareketsiz görecek birine yardımcı olmaz. Bu nedenle dışa aktarma işlemi artık hareketi bake ediyor: seçilen her klip simüle ediliyor ve kuyruğun dönüşleri gerçek keyframe’lere örnekleniyor. Dışa aktarıcı, kayıt işlemine başlamadan önce klibi kuyruk işlemin başladığı konuma dönene kadar sessizce çalıştırıyor; çünkü soğuk başlangıçtan bake edilen bir döngü kapanmaz ve kuyruk her tekrarda sıçrar. Uç bölüm bilinçli olarak en yumuşak bağlantıdır, dolayısıyla geçici hareketinin yatışması en uzun sürer ve tek bir ısınma geçişi her zaman yeterli olmaz.

İşlem bilinçli olarak temkinlidir. Yalnızca pelvisten sarkan uzun bir parça için zincir oluşturur. Kulaklara, saçlara ve kollara dokunulmaz; gövde üzerindeki geniş parçalar da aynı şekilde korunur. Önceki bir sürüm pelerini veya eteği katı biçimde gövde kemiğine bağlamıştı ve gerçek yüklemelerdeki sonucu görmek fikrimizi değiştirdi. Örneklerden biri, rigger’ın kalçalara ve her iki uyluğa mantıklı biçimde dağıttığı, beldeki 6.540 vertex’li bir giysiydi; tek bir kemik, giysinin bacakları takip etmesini tamamen engellerdi. Bir giysiyi tek bir kemiğe bağlamak, parçanın ne olduğuna dair bir tahmine dayanarak başkasının karakterinde yapılan büyük bir değişikliktir; bu nedenle artık kendiliğinden başınıza gelen değil, özellikle talep ettiğiniz bir işlemdir. İleri düzlemin ötesinde bacaklarla çarpışma yoktur ve karakter hareketsiz dururken boşta salınım gerçekleşmez; dolayısıyla ayakta duran bir tilkinin kuyruğu, taşıma pozunda sessizce sarkar. Sıradaki iki iş bunlar; ayrıca farklı bir dinlenme pozu ve farklı bir yay gerektiren kanatlara da aynı yaklaşımın uygulanması planlanıyor.