FER |  ZEMRIS |  Računalna grafika |  Računalna animacija 
Smanji tekst Povećaj tekst

Opis algoritama i struktura podataka


Klasična metoda


Kod klasične metode detekcije sudara, potrebno je provjeriti za svaki od n objekata u sceni da li je u koliziji sa ostalih n-1 objekata. Dakle, ukupno je za koliziju potrebno provjeriti: n*(n-1)/2 parova. Čak i kad je test kolizije trivijalan, kao što je slučaj kod kugli, to postaje problem pri velikom broju objekata. Npr. Kod 10.000 pokretnih objekata na sceni potrebno je za koliziju ispitati gotovo 50 milijuna parova, i tako u svakom koraku simulacije.


BSP stablo


BSP stablo je struktura podataka koje se može koristi kod pretrage i sortiranja objekata u n-dimenzionalnom prostoru. Stablo kao cjelina predstavlja cijeli prostor, a svaki čvor predstavlja konveksni dio tog prostora. Svaki čvor (osim krajnjih čvorova – listova) ima hiper-ravninu koja dijeli prostor koji predstavlja na dvije polovine. Svaki čvor također sadrži i reference na ta dva nova čvora. BSP stablo se najčešće koristi u 2D ili 3D prostoru. U tim slučajevima hiper-ravnine su zapravo pravci i ravnine.


BSP stablo se u širokoj fazi detekcije sudara koristi u svrhu smanjenja potencijalnih kolizijskih parova koje treba evaluirati. Koliko to smanjenje iznosi, ovisi o dubini samog stabla i uspješnosti odabira što boljih ravnina podjele. Poželjno je da ravnina podjele dijeli prostor na pola, tj. da je sa obje njene strane jednak broj objekata. Također je poželjno da je redundancija pri tome što manja, tj. da je što manji broj objekata koji se nalaze sa obje strane ravnine podjele (zbog toga što ih ravnina siječe).

BSP stablo
Slika 1. Podjela prostora BSP stablom i samo stablo.

Na slici 1 je pomoću BSP stabla dubine 2 broj potencijalnih kolizijskih parova smanjen sa 55 na 11. Kod većeg broja objekata, dobitak je još veći. Tako, npr. dok kod 10.000 objekata klasičnom metodom imamo oko 5 milijuna parova, uz idealnu podjelu objekata unutar BSP stabla dubine 9, broj parova je približno 50 puta manji.


Glavni nedostatak BSP stabla u primjeni kod široke faze detekcije sudara u dinamičnim scenama je taj što se raspored objekata u sceni tijekom vremena mijenja, te početno BSP stablo, koje je statična struktura, ne daje jednaki faktor ubrzanja kao što je davalo na početku. Zbog toga su potrebna proširenja BSP stabla, koja ga prilagođavaju promjenjivom rasporedu objekata na sceni.


Samo-podesivo BSP stablo


Sve što je rečeno za BSP stablo u prošlom dijelu vrijedi i za samo-podesivo BSP stablo. Jedini dodatak je taj što se nad BSP stablom periodički, nakon vremena T, izvodi funkcija podešavanja BSP stabla. Ona prilagođava oblik stabla novom rasporedu objekata u sceni, kako bi se dobio što bolji raspored objekata po listovima stabla.


Potrebno je vršiti balans između želje za odabirom što boljih ravnina podjele i cijene funkcije kojom se takve ravnine biraju, zbog toga što će se ta funkcija vrlo često pozivati tijekom izvođenja simulacije. Zbog toga, i dodatnih pojednostavljenja koja takva odluka donosi, moguće ravnine podjele sam limitirao na x-y, y-z te x-z ravnine.
Stablo kod kojeg su ravnine podjele limitirane na taj način se zove kd-stablo (eng. kd-tree, k-dimensional-tree) i ono je specijalni slučaj BSP stabla, no u nastavku ću koristiti isključivo naziv BSP stablo.


Kod samo-podesivog BSP stabla svakih T = 0,2s se vrši podešavanje stabla. Ono se sastoji od balansiranja čvorova koji su nebalansirani, tj. odabira novih ravnina podjele za takve čvorove. Čvor se smatra nebalansiranim ako je omjer objekata sa jedne i druge strane njegove ravnine podjele manji od 0,5 (ili recipročno,veći od 2,0).

BSP stablo
Slika 2. Lijevo – nebalansirani čvor; Desno – nova os balansira čvor.

Kod podešavanja stabla, u sve čvorove stabla koji nisu listovi se spremaju objekti, i kada se usporedbom broja objekata utvrdi da neki čvor nije balansiran, za njega i njegovu djecu se odabiru nove osi podjele. Na slici 2 se može vidjeti kako radi funkcija balansiranja čvora u 2D. Kako navedeni čvor ima samo 2 lista, balansiranje je završeno. Detalji o implementaciji samog stabla i balansiranja se mogu pogledati u diplomskom radu koji se može preuzeti sa ove stranice.


Algoritam brojenja parova i pojednostavljivanja


Koristi se u širokoj fazi detekcije sudara, kao i BSP stablo, u svrhu smanjenja potencijalnih kolizijskih parova koje treba evaluirati. Algoritam se sastoji od dvije faze - prva je prikazana na slici 3.

Sweep and prune - 1. faza
Slika 3. Prva faza algoritma brojenja parova i pojednostavljivanja.

Prva faza (faza brojenja parova) počinje projekcijom minimuma i maksimuma omeđujućih volumena (tj. ploha u slučaju 2D) na sve osi (X, Y, Z u slučaju 3D ili samo X, Y u slučaju 2D). Kako se u ovom radu kao omeđujući volumeni koriste kugle, koje sve imaju isti radijus, dovoljno je projicirati na svaku os samo središte kružnice. Zatim se po svim osima projekcije središta sortiraju, te se linearnim algoritmom broje parovi objekata koji se preklapaju. Tako bi za scenu navedenu na prošloj stranici, te zadanu os dobili sljedeće parove objekata: (1,4), (2,4), (3,5). Postupak je potrebno ponoviti i za sve ostale osi. Dobiveni parovi pojedine osi se spremaju u zasebnu listu parova koju ima svaka os.


U drugoj fazi algoritma (fazi pojednostavljivanja) se vrši pojednostavljivanje, tj. dodatna eliminacija parova. Za to se koristi kvadratna matrica dimenzije jednake broju objekata. Svi elementi te matrice se na početku postave na nulu, a zatim, kad se po pojedinoj osi detektiraju parovi, u matrici se inkrementira element čiji redak i stupac je jednak indeksima dvaju objekata koji se po toj osi preklapaju. Pri tome se treba pobrinuti da je indeks prvog elementa manji od indeksa drugog – tako se zapravo koristi samo gornja trokutasta matrica. Za scenu navedenu na slici 3, te zadanu os dobili bi matricu prikazanu na slici 4.

Matrica
Slika 4. Matrica kolizijskih parova.

Postupak treba napraviti za sve osi. Stvarna provjera kolizije se vrši nakon toga, i to za sve elemente matrice u kojima piše da postoji poklapanje po svim osima (2 za 2D, tj. 3 za 3D). Pri tome se ne čita cijela matrica već samo parovi one osi koja ima najmanji broj preklapanja (elemenata u listi parova te osi). Prije sljedećeg koraka simulacije potrebno je sve elemente matrice koji su različiti od nula postaviti na nulu.



<< Uvod | Opis implementacije >>