Unutar jednog stanja izgled računamo po jednostavnoj formuli.
U petlji: Tražimo sledeći događaj. Menjamo stanja objekata koji učestvuju u njemu.
Efikasno. Precizna simulacija. Izgled u budućem trenutku možemo dobiti brzo (proporcionalno broju događaja). Ne možemo se vraćati u vreme pre prethodnog događaja. Retko izvodljivo.
Prikaz na primeru
Događaj: odskakanje od poda.
Stanje: period između dva odskakanja.
Stanje predstavljeno trojkom (t,p,v) označava da je loptica na početku tog stanja, u trenutku t, na podu u tački p (py=0) i ima brzinu v na gore (vy>0).
Za svaku lopticu računamo sledeći događaj, tj. kada će biti ponovo na podu.
Realizujemo događaje redom po vremenu dešavanja.
Realizacija događaja: Premeštamo lopticu u trenutak događaja (kada je ponovo na podu) i obrćemo menjamo y komponentu brzine.
Ball_Events
Simulacija bazirana na otkucajima (tick-based)
Otkucaji (tick-ovi) se dešavaju često (stotinama ili hiljadama puta u sekundi), ali ravnomerno, sa jednakim vremenskim intervalom između otkucaja.
Stanje se menja na svaki otkucaj.
U svakom otkucaju ažuriramo stanja svih objekata.
Najmanje efikasno. Simulacija nije precizna (dolazi do odstupanja u odnosu na model). Nije moguće vraćati se u nazad kroz vreme*. Uglavnom je jedini mogući način simulacije.
Prikaz na primeru
Stanje predstavljeno trojkom (t,p,v) označava da je poslednji otkucaj bio u trenutku t, i tada je loptica imala položaj p i brzinu v.
ttick je dužina vremenskog intervala između dva otkucaja.
Ažuriranje stanja se dešava prilikom svakog otkucaja, kada pomeramo vreme za ttick i računamo novi položaj i brzinu prema formuli za kretanje.
Ball_Ticks
Poređenje različitih metoda simulacije
Formula
Events
Ticks
Brzina
Preciznost
Premotavanje u napred
Premotavanje u nazad
Izvodljivost
Real-time simulacija
Vreme unutar simulacije odgovara stvarnom vremenu.
Omogućava ubacivanje događaja iz stvarnog sveta (npr. akcije igrača).
U svakom frejmu prikazujemo izgled sistema dokle je stigla simulacija.
Kod event-based i tick-based simulacije, pre iscrtavanja moramo da "doguramo" aktuelno stanje da obuhvati trenutak iscrtavanja.
voidupdateTo(double time){
while (tNext <= time) {
update(); // Prebacujemo stanje u sledeći tick.
}
}
Najčešća početnička greška: Vezivanje tick-ova za frejmove.
voiddrawFrame(){
update();
}
Nije dobro!
Ako je ttick fiksno, onda brzina simulacije zavisi od frame-rate-a.
Ako se za ttick koristi vreme proteklo između dva frejma, onda rezultat simulacije nije konzistentan.
Uvek treba da želimo determinističku simulaciju (da isti ulazni parametri uvek daju isti rezultat)! Kada želimo "nasumično" ponašanje, najbolje je koristiti generator pseudoslučajnih brojeva sa unapred zadatim seed-om.