Kod rješavanja
sudara izvršeno je nekoliko iteracija tako da su se tijela odbila jedna
od drugih nekoliko puta i dobilo se uvjerljivo ponašanje tijela. Iako
možda i nisu riješeni svi sudari pa se tijela i dalje sudaraju svejedno
se ažuriraju brzine i krene se na rješavanje kontakata. Algoritam
za rješavanje kontakata jednak je algoritmu za rješavanje sudara
osim što se za koeficijent elastičnosti koristi vrijednost nula tj.
sudari će se tretirati kao da su neelastični. Sudare je ispravno tretirati
na ovaj način zbog toga što se tijela koja se mnogo puta sudaraju
unutar kratkog vremenskog intervala vrlo brzo gube energiju i prestaju
se gibati.
Isto kao
i kod detektiranja sudara kontakti se detektiraju tako da se privremeno
odrede novi položaji tijela koje bi poprimili u sljedećem vremenskom
koraku i zatim se testiraju na sudare. Tako za tijela koja stoje na
podlozi ništa se neće detektirati prilikom detekcije sudara ali nakon
što im se promjeni brzina utjecajem gravitacije detektirat će se kontakti.
Koeficijent elastičnosti
Za svaki
vrh koji se nalazi unutar drugog tijela označi se da je u kontaktu.
Uzme se onaj vrh koji se nalazi najdublje unutar drugog tijela i giba
se prema drugom tijelu i na njega se primjeni neelastični impuls. Za
novu poziciju tijela ponovo se uzme vrh s najvećom dubinom sudara i
na njega se primjeni neelastični impuls. Postupak se ponavlja sve dok
se svi vrhovi barem jednom ne nađu izvan tijela ili se udaljavaju od
tijela. Pri tome se za bolju preciznost umjesto primjenjivanja potpunog
neelastičnog impulsa
za svaki vrh u kontaktu postepeno se u svakom koraku iteracije upotrebljavaju
impulsi , ,
sve do
u zadnjem koraku iteracije, čime se tijelo postepeno usporava umjesto
da se potpuno zaustavi. Negativni koeficijent elastičnosti označava
to da će se tijelo samo usporiti umjesto da promjeni smjer.
Propagirajući model
Veliki problem
se javlja kada imamo tijela koja stoje jedno na drugom tako da će biti
potrebno izvršiti više iteracija kako bi se svi kontakti detektirali.
Takav način rješavanja kontakata naziva se propagirajući model za
razliku od simultanog rješavanja kontakata.
Slika
16. Propagirajući model
Neka za primjer
imamo kocke koje stoje jedna na drugoj. Pod utjecajem gravitacije sve
kocke će početi padati istom brzinom tako da će se samo za kocku
na dnu detektirati kontakt sa podlogom. Rješavanjem kontakta kocka
na dnu će doći u stanje mirovanja i u sljedećoj iteraciji će se
detektirati kontakt između te kocke i kocke koja stoji na njoj. Sada
će se riješiti kontakt kao neelastični sudar tako da se gornja kocka
neće zaustaviti nego će se samo duplo sporije gibati. Da bi stvar
bila još gora sada će se i donja kocka nastaviti gibati i biti će
potrebno ponovo riješiti sudar između nje i podloge kako bi se zaustavila.
Vidimo da tijela sporo konvergiraju ispravnom rješenju pa je potrebno
mnogo iteracija kako bi se dobilo uvjerljivo ponašanje tijela.
Kontaktni graf
Kako bi se
povećala efikasnost rješavanja kontakata potrebno je konstruirati
kontaktni graf. Pomoću grafa će se odrediti redoslijed kojim će se
rješavati kontakti između tijela. Željeni redoslijed rješavanja
kontakata je u smjeru od podloge i drugih statičkih objekata prema
vrhu. Nakon određivanja novih brzina tijela zbog utjecaja gravitacije
za svako tijelo se odredi njegova nova pozicija u sljedećem vremenskog
koraku, zatim se odrede svi kontakti između tog i ostalih tijela. Za
svaki se kontakt u graf doda usmjereni brid koji pokazuje od trenutnog
tijela prema tijelu s kojim je detektiran kontakt. Tijela je potrebno
sortirati a to se postiže pretraživanjem grafa u dubinu. Tako se za
naslagane kocke dobije sortirana lista kocaka od dna prema vrhu kao
što pokazuje sljedeća slika.
Slika
17. Konstrukcija kontaktnog grafa
Za usmjereni
aciklički graf G sortiranje je prilično jednostavno. Sljedećim
algoritmom stvara se sortirana lista čvorova:
DFS(G)
{
za
svaki čvor u iz G
u.visited = false;
za
svaki čvor u iz G
ako (!u.visited) DFS-Visit(u);
}
DFS-Visit(u)
{
u.visited
= true;
za
svaki čvor v iz u.čvoroviDjeca
ako (!v.visited) DFS-Visit(v);
dodaj
čvor u u listu čvorova;
}
Za složenije
slučajeve poput skupa domino pločica složenih u krug gdje svaka leži
na onoj ispod sebe u jednu razinu se stavi podloga a sve pločice se
stave u drugu razinu. Znači sva tijela koja međusobno imaju cikličku
vezu postavljaju se u istu razinu kao što se vidi na slici 18.
Slika
18. Rješavanje cikličke veze u kontaktnom grafu
Sortiranje grafa koji
ima cikličke veze obavlja se na sljedeći način:
- izračunaj inverz grafa GT.
- pozovi DFS(GT)
kako bi se odredio redoslijed izlaza iz čvorova.
- pozovi DFS(G) s time da se
početni čvorovi u glavnoj petlji od DFS uzimaju obrnutim redoslijedom
od redoslijeda izračunatog u koraku 2.
- Za svaki novi čvor u glavnoj
petlji od DFS broj razine povećaj za jedan, a sve čvorovi do kojih
se dolazi rekurzivnim pozivom DFS-Visit označi trenutnim brojem razine.
Za primjer na slici 17.
Dobije se sljedeći kontaktni graf G.
Inverz GT
grafa G dobije se promjenom smjera svih veza unutar grafa.
Pretraživanjem u dubinu
inverznog grafa GT u koraku 2 dobije se sortirana lista (4,3,5,2,1).
U koraku 3 graf G se pretražuje obrnutim redoslijedom od redoslijeda
zapisanog u listi pa se tako prvo čvor 1 stavi u prvu razinu, zatim
se u sljedeću razinu stave čvorovi 2,3,4 i u zadnjoj razini čvor
5 čime dobijemo sortirane čvorove po razinama kao na slici 18. Dokaz da je
prethodni algoritam ispravan te njegov detaljniji opis mogu se pronaći u [10] i [11].
Propagiranje šoka
Bez obzira
na korištenje kontaktnog grafa svejedno će biti potreban dosta veliki
broj iteracija da bi se dobila uvjerljiva simulacija. No neovisno o
tome koliki je broj iteracija korišten nakon nekog vremena će se primijetiti
da tijela propadaju jedno u drugo pogotovo za simulaciju većeg broja
tijela naslaganih jedno na drugo. Da bi se riješio taj problem koristit
će se metoda propagiranja šoka [1]. To znači da će se nakon rješavanja
kontakata izvršiti još jedna iteracija na poseban način. Nakon rješavanja
kontakata u svakom nivou grafa za sva tijela u tom nivou masa se postavlja
na beskonačnu vrijednost (matrica sudara se postavi na nulu). Sada
se vidi prava svrha kontaktnog grafa. Ako se tijelo kojem je masa postavljena
na beskonačnu vrijednost nađe u sudaru s nekim tijelom iz višeg nivoa
njegova brzina se neće promijeniti pod utjecajem impulsa nego će tijelo
iz višeg nivoa dobiti duplo veću brzinu tako da će se tijela ispravno
razdvojiti. Nakon što završi propagiranje šoka, mase tijela je potrebno
vratiti na prethodnu vrijednost. Valja napomenuti da za dva tijela koja
su u kontaktu i nalaze se u istom nivou nijednom još nije postavljena
beskonačna masa tako da se među njima rješavanje kontakata obavlja
na uobičajen način. Međutim sada je spora konvergencija tijela lokalizirana
na manji skup.
Primjer rada
algoritma se može vidjeti na slici 19. Prolaskom kroz graf kontakata
u prvom nivou zbog kontakta s podlogom kocka na dnu se zaustavlja te
joj se masa postavlja na beskonačnu vrijednost. U sljedećem nivou
kocka koja je iznad nje se zaustavlja i masa joj se postavlja na beskonačnu
vrijednost i tako se nastavlja sve do zadnjeg nivoa. Vidimo kako nam
kontaktni graf omogućuje da se u jednom prolazu ispravno zaustave sva
tijela.
Slika
19. Princip rada metode propagiranja
šoka.
Da bi vidjeli
zašto je potrebno prvo izvršiti nekoliko iteracija rješavanja kontakata
pomoću propagirajućeg modela prije primjene propagiranja šoka poslužit
će primjer na slici 20. Kontaktni graf pokazuje od podloge prema vrhu.
Ako bi se sada odmah primijenilo propagiranje šoka, daska bi poprimila
beskonačnu masu tako da bi desna teža kocka vidjela dasku beskonačne
mase i ne bi mogla gurnuti dasku prema dolje. Propagirajući model nam
omogućava da daska dobije ''osjećaj težine''. Korištenjem određenog
broja iteracija, daska i tijela u kontaktu s njom dobiju odgovarajuće
brzine prije primjene konačnog propagiranja šoka, čime je omogućeno
da desna kocka gurne dasku prema dolje i da daska gurne lijevu kocku
prema gore.
Slika
20. Propagirajući model omogućava
da teža kocka gurne dasku prema dolje
i da zatim daska gurne lijevu kocku prema gore.
|