opengl particle system 2008 riccardo petelin – egd prof. matjaž hmeljak
TRANSCRIPT
OpenGL Particle System2008 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)
• 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
Qual è l’idea?
Come si realizza?
Y
X
Z
X, Y, Z sono variabili aleatorie. Nella mia realizzazione ho usato la distribuzione di probabilità uniforme, ma qualsiasi altra distribuzione andrebbe ugualmente bene.
T=0
Y
X
Z
T=1
Y
X
Z
T=2
E’ possibile inserire forze esterne che agiscono sulle particelle, come la gravità.
• 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?
Come si realizza in OpenGL?
Particle(float x, float y, float z, float r, float g, float b) {
// set positionposition[0] = x; position[2] = y; position[1] = z;
// set colorcolor[0] = r; color[1] = g; color[2] = b;
// create random directiondirection[0] = (10000 - rand()%20000)/10000.0f;direction[1] = (10000 - rand()%20000)/10000.0f;direction[2] = (10000 - rand()%20000)/10000.0f;
// set random lifespanlife = rand()%15000/9500.0f;
}
Ogni particella ha una posizione, un vettore direzionale e un tempo di vita.
Dopo ogni istante questi valori possono venire aggiornati in base al fenomeno da modellare
• 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
Come si realizza in OpenGL?
• 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
Gli effetti
The image is created by John Tsiombikas, using the free-software 3D visualization system (http://engfx3d.berlios.de) and placed in the public domain.
• 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
Ricapitolando
• 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
Appendice: uso di FrameTimer
• 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
Ringraziamenti e Bibliografia