Posto sam se i s ovom vjezbom solidno izjebao da mi proradi odlucio sam napisat neke upute u nadi da ce nekom pomoc. Ukratko cu pojasnit kak sam napravio dio 2.3 i iz dijela 2.4 dio s bojom i velicinom cestice.
Kod sam si organizirao u 2 klase i pomocne funkcije.
Prva klasa je Particle klasa. U njoj imate sve sto vam treba za pojedinu tocku: poziciju, brzinu, starost, velicinu cestice, boju i duzinu zivota:
pozicija = [0.0, -10.0, 0.0]
brzina = [0.0, 0.0, 0.0]
starost = 0
velicina = VELICINA # ovo sam definirao kao neku konstantu koju sam kasnije stimao
boja = [0.0, 0.0, 0.0, 0.0] # prva 3 broja su rgb vrijednosti od 0 do 1, zadnji alpha
duzina_zivota = max(1, N(100, 40)) # N oznacava normalnu razdiobu
Funkcije koje su mi trebale su bile: funkcija za povecanje starosti, funkcija za promjenu parametara pojedine cestice i funkcija za promjenu boje. U povecanju starosti se samo inkrementira brojac a preostale dvije glase ovako nekako:
promijeni_parametre():
vektor_pomaka = [N(0, 12), 6, 0]
normaliziraj vektor_pomaka
t = (duzina zivota - starost) / duzina_zivota # na ovaj nacin parametar t je izmedu 0 i 1
brzina = vektor_pomaka * KONSTANTA_BRZINE * t**(-0.5) # funkcija t**(-0.5) se moze mijenjat
pozicija = pozicija + brzina
velicina = t * velicina**2
promijeni_boju(t)
promijeni_boju(t):
boja[0] = f_za_crvenu(t)
boja[1] = f_za_zelenu(t)
boja[2] = f_za_plavu(t)
boja[3] = f_za_alpha(t)
Funkcije za boje i alpha sam redom definirao ovako:
za crvenu: f(x) = x
za zelenu: f(x) = -\big(\frac{1}{x-2}\big)^7
za plavu: \: \: f(x) = (1-x)^2
za alfu: \: \: \: \: f(x) = -(x + 0.5)^{-15} + 1.2
Druga klasa mi je bila Source klasa koja sadrzava samo listu cestica i 3 funkcije: funkciju koja stvara cestice i stavlja ih u listu, funkciju koja svim cesticama inkrementira starost i funkciju koja svim cesticama mijenja parametre i izbacuje cesticama kojima je starost dosegla duzinu zivota.
Konacno, main dio programa se svodi na sljedece:
napravi prozor i postavi pogled
procitaj teksturu
napravi Source
vrti zauvijek:
napravi proizvoljan broj novih cestica
promijeni parametre i boju svih cestica
iscrtaj cestice
povecaj starost cesticama
pricekaj par ms
Preskocio sam funkciju za teksturu:
w, h = 256, 256
image = ucitaj sliku teksture kao intove
texture = glGenTextures(1)
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, w, h, GL_RGB, GL_UNSIGNED_BYTE, image)
glBlendFunc(GL_SRC_ALPHA,GL_ONE)
glEnable(GL_BLEND)
glEnable(GL_TEXTURE_2D)
Funkcija za crtanje mi je bila slicna kao i funkcija za crtanje tijela u 1. labosu. Jedna napomena kod te funkcije je da treba primijenit teksturu na sljedeci nacin:
# ako imamo cesticu p i donji lijevi kut
glTexCoord2d(0, 0)
glVertex3f(p.pozicija + [-p.velicina, -p.velicina, 0])
# ako imamo cesticu p i donji desni kut
glTexCoord2d(1, 0)
glVertex3f(p.pozicija + [ p.velicina, -p.velicina, 0])
itd. za preostala dva kuta i tu istu cesticu. Ako ste sve napravili kao ja trebali biste dobiti simulaciju vatre.
Imao sam danas u 4, a asistent mi je bio nuic. Prvo sam pokrenuo kod i ukratko objasnio koji dio koda radi sto. Pitao me da promijenim boju cestica u zelenu, sto bi sve morao dodati ako zelim imati iz rotirajuce stapove koji na svojim rubovima imaju te cestice, a izvor se jos dodatno pomice i zasto mi cestice trzaju lijevo ili desno kako stare.