holodepth

Babylon.js · Animasyon

Skeleton animation: kemikler örgüyü nasıl taşır?

Karakter iskeleti, birbirine bağlı kemik ( bone, joint) düğümlerinden oluşur; görünür örgü ise her köşe için «bu noktayı hangi kemikler ne kadar çeksin?» sorusunun yanıtıyla skinning ( deri bağlama) ile deforme olur. Animasyon verisi doğrudan köşelere gitmez — önce kemik dönüşümleri güncellenir, sonra örgü bu dönüşümlerden hesaplanır.

Holodepth Three.js tarafında aynı yapı çoğu zaman SkinnedMesh, Bone ve Skeleton ile anlatılır; Babylon.js tarafında da soyutlama benzerdir — asıl fark sınıf adları ve sahne grafiği düzenidir; matematik ( ağırlıklı kemik matrisleri) ortaktır.

Özet: dört bağlantı

Parça Rol Belirti
Kemik ağacı Dönüşüm zinciri (ebeveyn → çocuk). Uç kemik hareket etmez — aralık kopuk.
Bağlama pozu Ağırlıkların tanımlandığı referans. İlk yüklemede model «patlar» veya çarpılır.
Ağırlıklar Köşe başına kemik payları. Cilt yırtılır veya titrer.
Palet Kemik matrislerinin örneklemede toplanması. Performans düşüşü (çok kemik).

Kemik hiyerarşisi: kökten uca zincir

İskelet düşünürken her düğümü yalnızca kendi yerel dönüşümüyle değil, ata zincirinin ürünü olarak okuyun: çocuk kemik, ebeveynin dünya matrisiyle bileşilir; kök kemik ise sahneye hangi düğüme asıldığına bağlıdır. Bu yüzden omuz oynadığında dirsek ve bilek aynı anda taşınır — çocuk «ekstra animasyon» taşımaz, zinciri miras alır. Kopuk üst düğüm ( parent eksik), yanlış sırada içe aktarılmış eklem veya kökün yanlış ölçeklenmiş bağlanması «bilek dünya uzayında savruluyor», «bacak gövdeden kopuk» gibi dramatik sapmalara yol açar. Bu bölüm bağlama matrislerini (bölüm 2) veya köşe ağırlıklarını (bölüm 3) hesaplamaz; yalnızca ağaç topolojisinin sahne grafiğinde doğru kurulduğunu sabitler.

Bağlama pozu ve ters bağlama

Köşe ağırlıkları (bölüm 3), örgünün DCC içinde dondurulmuş bir bağlama duruşunda ( bind pose / rest pose) boyanmıştır; bu duruş «deri henüz kemikle aynı hizada» anıdır. Oynatma sırasında kemikler bu duruştan uzaklaştıkça köşeler yeni konuma taşınır. Grafik motorunda bu genelde önce bağlama uzayından çıkmak, sonra güncel kemik dönüşümleriyle çarpmak için saklanan ters bağlama matrisleri ( inverse bind) ile yapılır; dosyada bu blok eksik, sıfırlanmış veya eksen el değişimi ( coordinate frame) yüzünden yanlışsa karakter ilk karede buruşmuş veya ters uzatılmış görünür. İçe aktarımı Asset loading ve sahne ölçeğiyle birlikte doğrulayın; bu bölüm kemik ağacı topolojisini (bölüm 1) veya örnekleyici palet sınırını (bölüm 4) genişletmez.

Skinning ağırlıkları: köşe başına çoklu kemik

Her köşe, etkilendiği kemiklerin indeksleri ve bunlara karşılık gelen skaler ağırlıklar ile taşınır; gerçek zamanlı boru hatlarında köşe başına etki sayısı çoğu zaman dört ile sınırlıdır ( four bones per vertex). Daha fazla etki DCC’de kalmışsa export aşamasında budanır veya yakın etkiler birleştirilir — aksi halde veri ya kesilir ya da farklı motorlarda farklı budanır. Ağırlıklar tipik olarak toplamı 1 olacak şekilde normalize saklanır; toplam 0.8 veya 1.2 gibi sapmalar örgünün içe çökmüş veya şişmiş görünmesine yol açar. Bu bölüm kemik ağacının sırasını (bölüm 1) veya GPU’daki palet boyutunu (bölüm 4) ele almaz; yalnızca hangi kemiklerin köşeyi ne kadar çektiği verisidir.

Yaygın görsel kusur

Eklem hizasında ani ağırlık sıçramaları, animasyon klibinin kendisinden çok boya geçişlerine benzer kırışıklık veya yırtık üretir. Sorunu yalnızca oynatıcıda aramak saat kaybettirir; önce DCC’de yumuşatılmış ağırlık haritası, sonra export ön izlemesi, en son motor tarafı doğrulama sırası işe yarar. Bu kutu örnekleyicideki palet sınırını (bölüm 4) veya isim eşlemesini (bölüm 5) değiştirmez.

Kemik paleti ve örnekleme kıyısı

Ağırlıklar veri tabanında saklanır; fakat ekranda deformasyonu uygulayan yer çoğu zaman vertex shaderdır. Burada kemik başına güncel dönüşümler bir palet ( dizi veya doku) olarak örnekleyiciye taşınır; köşe de kendi ağırlıklarına göre bu paletin doğrusal kombinasyonunu alır. Kemik sayısı arttıkça sabit kayıt ( uniform) veya doku boyutu tavanına yaklaşırsınız; aynı sınır, sahne başına çok sayıda skin örgüsü olduğunda daha erken hissedilir. Bu bölüm ağırlık boyası kalitesini (bölüm 3) veya anahtar klibin kemiklere yazılmasını (bölüm 5) anlatmaz; yalnızca çalışma anı donanım bütçesi açısından iskelet karmaşıklığını okur.

  • Sadelik: kamerada görünmeyen yardımcı kemikleri veya sıfır ağırlıklı halkaları üretimde temizleyin; her aktif kemik palete maliyet yazar.
  • LOD: uzak mesafede düşük poligon gövde kullanıyorsanız kemik sayısı ve ağırlık yoğunluğu da bu varyantla uyumlu olmalıdır; aksi halde uzak modelde gereksiz palet taşınır.

Animasyon verisi kemiklere bağlanır

Keyframe animation sayfasındaki izler, bu bağlamda çoğu zaman kemik düğümlerinin TRS değerlerini günceller; örgü üzerinde köşe köşe kod yazmanız gerekmez — örgü, bölüm 3’teki ağırlıklar ve bölüm 2’deki bağlama/ters bağlama matematiğiyle kemikleri izler. Klibin sahneye oturması için isim eşlemesi ( bone name map) kritiktir: dış dosyadaki kemik adı ile motor düğüm adı bir karakter farkıyla bile ayrılırsa iz yanlış hedefe yazılır ve bacak izi kol kemiklerinde oynar. Bu bölüm örnekleyici palet boyutunu (bölüm 4) veya hiyerarşi topolojisini (bölüm 1) yeniden tanımlamaz; yalnızca animasyon verisinin kemiklere nasıl bağlandığını özetler.

Three.js ile üst üste okuma

Çakışmayı önleyen çerçeve

Three.js tarafında SkinnedMesh, Skeleton ve Bone üçlüsü birlikte anlatılır; Babylon.js sahnesinde de «skin örgü + iskelet örneği + kemik düğümleri» ayrımı aynı soruları sorar. Taşımanız gereken paket yine kemik ağacı → bağlama ve ters bağlama verisi → köşe başı ağırlıklar zinciridir; önceki bölümler zincirin halkalarını ayrı ayrı sabitler. Kütüphane değişince API adları değişir fakat dosyadan sahneye giderken yaşanan tuzaklar — eksen el değişimi, birim ölçeği, isim eşlemesi, fazla kemik paleti — motor bağımsız kalır; Three öğretisinden geçerken bu sayfayı kontrol listesi olarak kullanın.

Animasyon dizisinden sonra: motor & sahne

İskelet ve skinning akışı netleştikten sonra içeriği sahneye taşıma pratiği için Asset loading sayfasına geçebilirsiniz. Önceki adım: Keyframe animation.