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
Scarica

Petelin_OpenGLParticleSys