Bir animasyonun dünyaya dokunması gerektiğinde
Oleg Sidorkin, Cinevva CTO’su ve Kurucu Ortağı
Bir yürüme animasyonu bacakların nasıl hareket ettiğini bilir. Ancak bir ayağın basamağa ulaştığını bilmez. Bir uzanma animasyonu kolun nasıl hareket ettiğini bilir. Ancak bu belirli anahtar deliğinin nerede olduğunu veya birinin bardağın yerini değiştirdiğini bilmez.
Bu, bir karakteri otomatik rig’leme işleminden sonraki sorundur: animasyonun oyun çalışırken sahneye tepki vermesini sağlamak. Cinevva’nın Three.js çalışma zamanında deneysel bir düzeltme katmanı uyguladık. Bu katman, animasyonun ürettiği pozu okuyor, sahneyi sorguluyor ve kare işlenmeden önce karakterin eklemlerini ayarlıyor.
Aşağıdaki örnekler bu kodu tarayıcınızda çalıştırır. Kare başına çalışan döngüde hareket üretme isteği yapılmaz.
Farkı deneyin
Demo otomatik olarak başlar. Bir örnek seçin ve Düzeltmeler seçeneğini kapatıp açın. Soldaki karakter temel pozu gösterirken sağdaki karakter canlı düzeltmeyi alır. Belirli bir anı incelemek için animasyonu duraklatıp zaman çizelgesini sürükleyin. Karakterin çevresinde dönmek için iki görünüm alanından birini sürükleyin, yakınlaştırmak için kaydırın veya sıkıştırın, yatay kaydırma için sağ tuşla sürükleyin. Her iki kamera da senkronize kalır; böylece aynı teması tam olarak aynı açıdan inceleyebilirsiniz.
Her örnek aynı Cinevva otomatik rig’li kurbağayı kullanır. Yürüme örneği, Auto Rigger’ın kullandığı aynı kodla yeniden hedeflenen Evrensel Animasyon Kütüphanesi’ndeki Yürüme animasyonunu oynatır. Her iki görünüm alanı da gerçek klibi oynatır; sağdaki, çalışma zamanında arazi düzeltmeleri ekler. Diğer örnekler gömülü Idle referansını ve etkileşim denetleyicilerini korur.
Yürüme denetleyicisi bir adım ilerisini planlar. Hareket eden basamağın ayağın yere değeceği andaki konumunu tahmin eder, kurbağanın tüm tabanını iniş alanının ortasına yerleştirir ve yaklaşan salınımı gelecekteki basamak yüksekliklerinin üzerinden geçirir. Adım uzunluğunu ayarlarken kütüphane klibinin temposunu ve salınım şeklini korur. Pelvis, yere basmadan önce ağırlık aktarımına ve yükseklik değişimine başlar; ardından IK, uzuvları planlanan hedeflere yerleştirir ve görünür taban temasını hassaslaştırır.
Öngörülen temas konumlarındaki çerçeveli tabanları ve kesik çizgili salınım yollarını görmek için Adım planı seçeneğini açın. Pelvis izi gövde hareketlerini karşılaştırır, Pelvis izini kaydet ise ölçümleri korur. Bu planlayıcı şu anda demodaki bilinen öteleme hareketli basamakları işler. Uygulanamaz inişleri bildirir; gelişigüzel arazide yön bulma ve fiziksel denge kuvvetleri motorun ayrı sorumluluklarıdır.
Merdivene tırmanma, üç temas kendi basamaklarını tutarken uzuvları teker teker aktarır. Tırmanan karakteri görünümde tutmak için merdiven aşağı doğru hareket eder. Belirgin ayak bileği ve el hedefleri temasları yerleştirirken dirsek/diz kılavuzları bükülme noktalarını merdivenden uzak tutar. Gövde hareketi ve temas sırası önceden hazırlanmıştır; bu, otomatik bir tırmanma planlayıcısı değildir.
Neler uygulandı?
| Yetenek | Çalışma zamanının bugün yaptığı |
|---|---|
| Engebeli zemin | Her ayak için bir destek noktası sorgular, kalibre edilmiş taban normalini hizalar ve pelvis yüksekliğini ayarlar. |
| Sabit basan ayaklar | Duruş temasını, ayağı destekleyen yüzeye göre sabit tutar. |
| Hareketli platformlar | Bu teması, öteleme veya dönme hareketi yapan destekle birlikte taşır. |
| El hedefleri | Bir kolu, harmanlama ağırlığıyla birlikte dünya uzayındaki bir konum ve yönelime doğru çözer. |
| Tutulan nesneler | Bilek hedefini, istenen nesne pozundan ve sabit bir kavrama dönüşümünden türetir. |
| Erişilemeyen hedef | Çözümü sınırlar ve karakterin yeniden konumlandırılması gerektiğini bildirir. |
Bu, isteğe bağlı bir çalışma zamanı prototipidir. Etkileşimli örnekler uygulamayı gösterir; Cinevva ile oluşturulan her oyunun bunu otomatik olarak etkinleştirdiği anlamına gelmez.
Sabit basan bir ayağın referans çerçevesine ihtiyacı vardır
Mevcut yeniden hedefleyicimiz, bir klip farklı oranlara sahip karakterler arasında aktarılırken oluşan bazı ayak kaymalarını zaten düzeltir. Çalışma zamanında zemine oturtmanın başka bir girdisi daha vardır: karakterin o anda üzerinde durduğu yüzey.
Bir ayak duruş evresine girdiğinde yeni katman, temas noktasını destekleyen nesnenin yerel koordinatlarında kaydeder. Statik bir zeminde gövde hareket ederken ayak yerinde kalır. Hareketli bir platformda aynı kayıtlı nokta platformla birlikte hareket eder. Noktayı yalnızca dünya koordinatlarına sabitlemek ayağın geride kalmasına yol açardı.
Ardından pelvis, her iki bacağın da erişebileceği sınırlı bir yükseklik aralığında hareket eder ve her bacak kendi ayak hedefine doğru çözülür. İlk testlerden biri, fark edilmesi güç bir hatayı ortaya çıkardı: erişim sınırında pelvisi yumuşatmak, bir ayağın eğimde kısa süreliğine havada kalmasına neden oluyordu. Artık yumuşatma uygulanabilir aralığın içinde kalıyor.
Kurbağa ayrı bir kalibrasyon hatasını ortaya çıkardı: en alttaki ayak parmağının temas etmesi, tabanın yüzeye oturduğu anlamına gelmez. Demo artık pozlanmış her ayak mesh’ine bir destek düzlemi uydurarak hem konumu hem de normali kalibre ediyor. İşlenmiş regresyon, Idle boyunca en alttaki yüzey noktasının yanı sıra birbirinden ayrı üç taban temasını da ölçüyor.
Paylaşılan gövde desteği denetimi, ağırlıklandırılmış gövde bölümlerinden kütle merkezini tahmin eder ve örnek niteliğindeki taşınan nesne yüklerini hesaba katar. Ayakta durma ve uzanma örnekleri, pelvisi yük binen ayaklara yönlendirmek için bunu kullanır. Yürüme sırasında öngörülen ağırlık aktarımını adım planlayıcısı yönetir; statik bir destek alanı merkezleme düzeltmesi planlanan hareketle çatışmamalıdır. Tanılama araçları tahmini COM’u ve destek temaslarını göstermeye devam eder. Yürüme örneği Planlanan ağırlık aktarımı bildirirken merdiven örneği kavrama kuvvetlerinin henüz doğrulanmadığını belirtir.
Yürüme hâlâ zamanlama gerektirir. Oyun, her ayak için o anda ne ölçüde sabit basıyor kabul edilmesi gerektiğini belirten bir ağırlık sağlar. Salınım evresindeki ayak serbest bırakılmalıdır. Oyun ayrıca yürüyüş biçimini, karakterin hareketini ve bir sonraki basamak üzerindeki açıklığı da sağlar. Bu kararlar IK çözücüsü tarafından çıkarılmaz.
Anahtarı deliğe yerleştirin, ardından eli çözün
Bileği anahtar deliğine yöneltmek yeterli değildir. Anahtarın bir uzunluğu, yerleştirme ekseni ve kavrama ofseti vardır. Bilek hedefine kusursuz biçimde ulaşsa bile anahtarın ucu deliği ıskalayabilir.
Demoda etkileşim dizisi, anahtarın istenen konumunu ve dönüşünü tanımlar. Kavrama, anahtarı bu konuma getirmek için bileğin nerede olması gerektiğini belirtir. Ardından kol bu bilek pozuna doğru çözülür. İstenen konuma erişilemediğinde bile gerçek anahtar çözülmüş ele bağlı kalır.
Erişilemeyen hedef örneği bu başarısızlığı bilinçli olarak gösterir. Uzuv, ölçüm başarılı görünsün diye uzatılmaz; çalışma zamanı karakterin yeniden konumlandırılması gerektiğini bildirir.
Bu örnekte önceden hazırlanmış yaklaşma, yerleştirme ve çevirme aşamaları vardır. Henüz parmak kavramasını planlamaz veya anahtarın şeklini kilidin iç açıklığıyla karşılaştırmaz.
Sıvı dökmek aynı zamanda bir yönelim problemidir
Sıvı dökme örneği, kabı ağzının çevresinde eğerken kabın ağzını bardağın üzerinde tutar. Kap döndükçe gerekli bilek konumu değişir. Aynı el hedefi mekanizması bu değişen pozu takip eder.
Mavi akış, eğme sırasında etkinleştirilen görsel bir efekttir. Akışkan simülasyonu değildir. Buradaki amacı hizalamayı görünür kılmaktır: düzeltme olmadan bardağı ıskalar, düzeltmeyle alım alanına düşer.
Düzeltme nerede çalışır?
Bir oyundaki sıra şöyledir:
Karakteri hareket ettir → animasyonu değerlendir → poz ofsetlerini uygula → sahne temaslarını çöz → ikincil hareketi güncelle → işle.
Çalışma zamanı bunu, isteğe bağlı bir sceneIK yapılandırmasıyla createAnimator üzerinden sunar. Oyunlar temas ağırlıklarını, el hedeflerini ve zemine oturma durumunu update işlevine iletir. Bu işlev mevcut bir Three.js animasyon mikserini de sarmalayabilir.
Her rig için anlamlı ayak ve kavrama kalibrasyonu gerekir. Kemik adı eşleme bizi doğru uzva götürür, ancak ayak bileği eklemi ayakkabının tabanı değildir. Bu sürüm her ayak için kalibre edilmiş tek bir destek noktası kullanır; henüz topuk ve parmakların oluşturduğu tüm destek alanını modellemez.
Temel tekniklerin Unity’nin iki kemikli IK ve Unreal’ın IK çözücüleri içinde yerleşik karşılıkları vardır. Bizim uygulamamız, otomatik rig’lenmiş karakterlerimizin ihtiyaçları etrafında oluşturulmuş küçük, motor taraflı bir düzeltme katmanıdır.
Neleri kontrol ettik, geriye neler kaldı?
İlk doğrulama aşaması 14 sayısal ve entegrasyon testinin yanı sıra 3.840 kare boyunca örneklenen sekiz işlenmiş senaryo içeriyordu. Hareketli destekleri, eğim temasını, sabit animasyon izlerini, koordinat dönüşümlerini, erişim sınırlarını ve çalışma zamanı animatörü entegrasyonunu kontrol ettik. Tarayıcı otomasyonu ayrıca düzeltmeler etkin ve devre dışıyken canvas’ı karşılaştırdı ve dar yerleşimi test etti.
Ölçümler, uzuv-hedef hatasını kontrol eder. Bunlar, skin uygulanmış mesh’in her parçasının çarpışmasız olduğunun veya sonucun her karakterde doğal göründüğünün kanıtı değildir. Örnekler, bu sayılarla birlikte incelenebilecek kadar küçük tutulmuştur.
Sonraki katmanlar; adım planlama, daha iyi taban desteği, tüm gövdeyle uzanma, parmakla kavrama ve çarpışmayı dikkate alan etkileşim aşamalarıdır. Fiziksel olarak simüle edilen sıvı ise başlı başına ayrı bir sistemdir.
Şimdilik somut ve faydalı sonuç şudur: bir animasyon, ayakları ve elleri her karede sahneye tepki verirken temel hareketini koruyabilir. Bu da otomatik rig’lenmiş bir karaktere çevresindeki dünyayla etkileşim kurması için bir başlangıç noktası sağlar.