OpenGL Particle System 2008 Riccardo Petelin – EGD prof. Matjaž Hmeljak Cos’è? A cosa serve? • E’ un modello matematico per rappresentare su calcolatore fenomeni naturali con particolari caratteristiche • Sono fenomeni in cui è possibile individuare una sorgente e un numero molto grande di costituenti elementari • Esempi tipici sono i fuochi d’artificio, le esplosioni, le fontane, la scia di un aereo… Quake II (ID software 1997) Qual è l’idea? • Molti fenomeni naturali sono costituiti da un numero arbitrariamente grande di costituenti elementari (particelle) • Ogni particella ha un comportamento nello spazio e un ciclo di vita descritti da una variabile aleatoria con densità di probabilità nota e dipendente del fenomeno da modellare • Ogni realizzazione del modello è quindi sempre diversa ma tutte le particelle “nascono” dalla stessa sorgente Come si realizza? Y Y X Z X Z Z T=2 T=0 T=1 Y X X, Y, Z sono variabili aleatorie. Nella mia realizzazione ho usato la distribuzione di probabilità uniforme, ma qualsiasi altra distribuzione andrebbe ugualmente bene. E’ possibile inserire forze esterne che agiscono sulle particelle, come la gravità. Come si realizza in OpenGL? • Nel mio esempio ho utilizzato le liste concatenate (facendo uso dei puntatori, tipici del C) • Esempi più complessi fanno uso dei Vertex array (o Vertex buffer), ma la realizzazione è analoga Come si realizza in OpenGL? Particle(float x, float y, float z, float r, float g, float b) { // set position position[0] = x; position[2] = y; position[1] = z; Ogni particella ha una posizione, un vettore direzionale e un tempo di vita. // set color color[0] = r; color[1] = g; color[2] = b; // create random direction direction[0] = (10000 - rand()%20000)/10000.0f; direction[1] = (10000 - rand()%20000)/10000.0f; direction[2] = (10000 - rand()%20000)/10000.0f; // set random lifespan life = rand()%15000/9500.0f; } Dopo ogni istante questi valori possono venire aggiornati in base al fenomeno da modellare Come si realizza in OpenGL? • Ad ogni istante si creano nuove particelle che vengono appese in cima alla lista • Le particelle con tempo di vita < 0 devono essere periodicamente eliminate da un garbage collector, e la struttura della lista deve essere aggiornata di conseguenza • Esplorando la lista è possibile disegnare tutte le particelle nella loro posizione corrente Gli effetti • In base ai valori intrinseci di ogni particella è possibile applicare degli effetti in fase di disegno. Esempio: Quando il tempo di vita è prossimo allo 0 agisco sull’alpha channel per creare una dissolvenza The image is created by John Tsiombikas, using the free-software 3D visualization system (http://engfx3d.berlios.de) and placed in the public domain. Ricapitolando • Esempio: Un possibile modello matematico per i fireworks potrebbe essere (X,Y,Z) unif. su tutto [0,1]3, T gaussiana con m=3 secondi Appendice: uso di FrameTimer • Estensione di terze parti che serve a garantire un frame rate costante indipendente dalla dimensione della finestra di visualizzazione • Si include “FrameTimer.h” e si usano i 3 metodi: InitFrameTimer(); SortFrameTimer(); FrameTime(); • In pratica FrameTime() fornisce il valore del differenziale dt calcolato secondo l’orologio di sistema, che è proporzionale al frame rate Ringraziamenti e Bibliografia • Rob Bateman, An introduction to Particle Systems (http://www.robthebloke.org/) • EGD3D_26X1SFERA.cpp Materiale fornito durante il corso prof. Matjaž Hmeljak • The Particle Systems API - David K. McAllister