holodepth

Babylon.js · Animasyon

Animation state machine: klibi hangi kuralla seçeceksiniz?

Durum makinesi, karakterin şu an «koşuyor», «yerde», «ates ediyor» gibi ayırdığı modlar ile bu modlar arasındaki geçiş kurallarını tek yerde toplar — klip seçimi ve öncelik burada çözülür; süre ve yumuşaklık ise çoğu zaman Animation blending ve Animation group katmanında uygulanır.

Holodepth Three.js çekirdeğinde «tek doğru durum makinesi» yoktur; aynı iş çoğu zaman oyun kodunda veya harici bir FSM kütüphanesinde yazılır. Babylon.js projelerinde de makine mantığı genelde sahne grafiğinden ayrı bir katmanda yaşar — motor size animasyonu oynatır; «ne zaman hangisini» kararını siz tanımlarsınız.

Özet: dört tasarım kararı

Karar Soru Risk
Durum kümesi Hangi davranışlar ayrı düğüm? Çok ince → durum patlaması; çok kalın → esnek olmayan kaba bloklar.
Geçiş şartı Hangi girdi veya fizik olayı tetikler? Yanlış sıra — zıplarken ateş gibi imkânsız kombo.
Kesinti Uzun klip ortasında iptal edilebilir mi? Gecikmeli tepki veya kilitlenmiş oyuncu.
Görsel köprü Geçişte hangi çapraz solma süresi? Durum doğru ama görüntü sert veya süzülür.

Durumlar ve geçiş grafiği

Her durum, sahneye yazılan ham klibin ötesinde bir mantıksal etikettir: «şu an yere yapışık mıyım, havada mıyım, nişan alıyor muyum?» gibi. Her geçiş kenarı ise tipik olarak bir okuma cümlesi taşır («yerdeyken boşluk → zıpla»). Aynı görsel klip birden fazla durumda paylaşılabilir; fakat her durumdan çıkan kenar kümesi net olmalıdır — aynı düğümden aynı koşulla iki hedef seçiliyorsa girdi önceliği belirsizleşir. Bu bölüm tetik / koruma ayrıntısını (bölüm 2) veya kesinti önceliğini (bölüm 4) açmaz; yalnızca grafiğin iskeletini sabitler.

Koşullar: tetikleyici ve koruma

Kenar çoğu zaman iki parçadan oluşur: tetik (düğme, eksen eşiği, ağ olayı) ve koruma ( guard) — örneğin «ateş et» yalnız cephane > 0 ve soğuma süresi dolduysa. Tetik tek başına ateşlenebilir, guard başarısızsa oyun mantığı animasyonu reddeder; bu ikili farklı dosyalarda tekrarlanırsa makine bir şey seçer, oyun başka bir şey reddeder ve desenkron büyür. Koşulları mümkün olduğunca tek yerde toplayın; girdinin hangi sırayla okunacağını Control system ile aynı masada çözün. Bu bölüm durum düğümlerinin topolojisini (bölüm 1) veya giriş / çıkış yan etkilerini (bölüm 3) genişletmez.

Giriş, çıkış ve görsel köprü

Durum makinesi yalnızca klip seçmez; çoğu projede on enter ile ses, parçacık veya oyun sayacı gibi yan etkiler tetiklenir, on exit ile holster, silah modu veya kamera kısıtı temizlenir. Bunlar klip süresine kilitlenmek zorunda değildir — bir karede «durum değişti» sinyali yeterlidir. Görünür süzülme ise ayrı katmandadır: hangi iki durum arasında köprü kurulduğunu makine bilir, süreyi ve eğriyi çoğu zaman çapraz geçiş ve ağırlık politikası belirler. Bu bölüm öncelik tablosunu (bölüm 4) veya üst / alt makine ayrımını (bölüm 5) anlatmaz.

Varsayılan durum

Hiçbir kenar ateşlenmediğinde veya tanımsız bir girdi geldiğinde hangi düğüme düşüleceği ( idle, güvenli duruş) baştan yazılmalıdır; aksi halde saldırı veya özel hareket klibinin sonsuz döngüsünde takılı kalınır. Bu kutu tetik / guard cebirini (bölüm 2) değiştirmez; yalnızca grafik sızıntısını önleme ipucudur.

Kesinti ve öncelik sırası

Bazı durumlar düşük önceliklidir (ör. yeniden yükleme hazırlığı); bazıları yüksek öncelikle gelir ve önceki oynatmayı iptal eder (ör. hasar, sersemletme). Bu tablo, Animation blending içindeki α ağırlığından farklı bir şey seçer: orada iki poz birleşir; burada hangi kuralın geçerli olduğu ve hangi durumun diğerini kestiği belirlenir. Yanlış tablo, uzun saldırıda hareketin kilitlenmesi veya düşük öncelikli bir kenarın hiç seçilmemesi olarak görünür. Bu bölüm grafiğin düğüm ve kenar şeklini (bölüm 1) veya kemik maskeleme çözümünü (bölüm 5) yeniden yazmaz.

  • Kısa liste: üç ila beş öncelik seviyesi çoğu projeye yeter; her yeni seviye eklemek tabloyu üstel olarak karmaşıklaştırır.
  • Belge: «A, B’yi iptal eder mi?», «C çalarken D gelirse ne olur?» soruları tek tabloda cevaplanmalı; kod incelemesi yalnızca tabloyu doğrulamalı, tabloyu yeniden keşfetmemeli.

Üst ve alt gövde makineleri

Tam gövde için bir durum makinesi, üst gövde için ikincisi (nişan, jest, yüz ifadesi) paralel yürütülebilir; alt gövde koşarken üst gövde ateş animasyonuna geçmek tipik örnektir. Sorun, iki makinenin aynı kemik kümesine aynı anda nihai poz yazmak istemesidir — bu, makine topolojisinden ziyade Blending · maske ve katman politikası ile çözülür. Makine katmanı «hangi mantıksal moddasın?» sorusunu, blend katmanı «aynı kemikte bu iki mod nasıl birleşir?» sorusunu yanıtlar; ikisini birbirinin yerine koymayın. Bu bölüm kesinti önceliğini (bölüm 4) veya giriş yan etkilerini (bölüm 3) genişletmez.

Three.js ile üst üste okuma

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

Three.js çekirdeği AnimationMixer ile zamanı ve eylem ağırlıklarını yürütür; tam donanımlı bir «karakter durum makinesi» sunmaz — çoğu ekip geçişleri kendi kodunda veya harici bir FSM kütüphanesinde kurar. Babylon.js tarafında da motor klip ve grup oynatır; hangi durumun seçildiği çoğu zaman uygulama katmanındadır. Taşınması gereken şey tek satır API değil, önceki bölümlerde ayrıştırılan tasarım: düğüm ve kenarlar (1), tetik / guard (2), giriş ve çıkış yan etkileri ile görsel köprü (3), kesinti önceliği (4), üst / alt makine ve maske (5). Kütüphane değişse de bu kontrol listesi aynı kalır.

Sıradaki: anahtar kareler

Durum seçimi ile oynatıcı zamanı aynı karede ilerler; iz ve interpolasyon veri şeklini sabitlemek için Keyframe animation sayfasına geçebilirsiniz. Önceki adım: Animation group.