Está en la página 1de 20

Definicin

Un sistema de partculas es un grupo de


entidades que comparten reglas lgicas.
Ejemplos: lluvia, fuego, arena, viento, etc.
Muchos fenmenos naturales pueden ser
modelados con sistemas de partculas
We dont try to model the outcome of a system,
we try to model the system and see its outcome
- Andre LaMothe

Estructura fsica
Partcula: entidad que guarda las
propiedades individuales entregadas por
el sistema y se ve afectada por ellas.
Grupo de Partculas: se encarga de
agregar o quitar partculas al sistema.
Sistema de Partculas: organiza todas las
partculas y les da propiedades.

Partcula
Propiedades tpicas: posicin, color,
velocidad, edad.
No existe lmite en el tipo o cantidad de
propiedades.
Suelen tener vida limitada, al morir son
creadas de nuevo con propiedades
iniciales.

Grupo de Partculas
Almacena todas las partculas para que
su uso sea ms simple
Acciones limitadas, slo agregar o quitar
partculas.
Tales acciones se deben comnmente a
la muerte o nacimiento de una nueva
partcula.

Sistema de Partculas
Genera las reglas por las cuales las
partculas se rigen.
Mientras avanza el tiempo, se encarga de
renovar las propiedades de las partculas.
Controla la lgica detrs de las acciones.

Estructura Lgica
Emisor: espacio en donde se generan las
partculas
Administrador: se encarga de las
propiedades globales de las partculas y
cuando se ejecutan acciones
Acciones: funciones que actualizan
propiedades de las partculas segn
alguna mtrica (e.g. tiempo)

Emisor
Espacio geomtrico en el cual las
partculas son generadas.
Cuando nacen, el emisor les entrega
propiedades iniciales dentro del rango
creado por el sistema de partculas.

Administrador
Es la clase Sistema que engloba todas las
partculas, el emisor y las acciones.
El Administrador es el nexo entre un
programa y el sistema de partculas.
Llamadas frecuentes: Actualizar y Dibujar.

Acciones
Cambios en las propiedades se debe a
las acciones
Son llamadas por el administrador cuando
algn criterio se cumple.
Ejemplo: chocar, cambiar color, cambiar
velocidad, morir.

Implementacin OpenGL

Partcula
public struct Particula
{
public Vector3 pos;
public Vector3 pos_ant;
public Vector3 vel;
public Vector3 vel_ant;
public Vector3 color;
public float alpha,edad;
}

Implementacin OpenGL

Grupo Partcula
public struct Grupo
{
public int cantidad;
public int max_cantidad;
public Particula[] p;
public void Sacar(int i)
public bool Agregar(Vector3 pos,Vector3 pos2,Vector3 color,
Vector3 vel,params float[] extra)
}

Definin: Rangos y Dominios


Dominio: Espacio tridimensional
cualquiera (Cubo, Esfera, Punto,
Plano),definido por una posicin y otros
valores necesarios, tales como radio.
Rango: conjunto de vectores definidos
dentro de un Dominio, si el vector se
encuentra dentro de un Dominio,
pertenece a l.

Ejemplos Rango
Dominio Esfera(0,0,0,radio 5)
Rango es cualquier vector del origen a
una distancia 5.
Dominio Punto(4,2,1)
Rango es slo el vector (4,2,1).

Implementacin OpenGL

Informacin Emisor
public struct sEmision
{
public Rango posicion ,velocidad ,color
public float alpha,frecuencia0 ,edad ,dev_edad;
var)

public sEmision(float frecuencia,Dominio tipo,params float[]


{
this.frecuencia = frecuencia;
this.posicion
= new Rango(tipo,var);
alpha = 1; edad = 0;dev_edad = 0;

Implementacin OpenGL
Clase Sistema
public class Sistema
{
Random r= new Random();
Grupo grupop;
sEmision Einfo;
int tiempo;

public Sistema(int mCantidad)


{
grupop.p = new Particula[mCantidad];
grupop.max_cantidad = mCantidad;
// inicializar Las propiedades globales
}

Implementacin OpenGL
//Se llama para indicar donde se generarn las partculas
public void Emisor(float freq,Dominio tipo,params float[] var)
{
Einfo = new sEmision(freq,tipo,var);
Einfo.velocidad = Valor.Vel;
Einfo.color = Valor.Color;
Einfo.alpha = Valor.alpha;
Einfo.edad = Valor.edad;
Einfo.dev_edad = Valor.dev_edad;

Implementacin OpenGL
public void Actualizar(){
int deltat =1000;
if((deltat - tiempo) > Valor.dt){
Vector3 acc =new Vector3(0,0,0);
for(int i=0;i<grupop.cantidad;i++){
Valor.Accel.GenerarPunto(ref acc,ref r);
grupop.p[i].edad +=Valor.dt*10;
grupop.p[i].pos +=grupop.p[i].vel*Valor.dt;
grupop.p[i].vel +=acc*Valor.dt; }}
tiempo = deltat;
AccionEmisor();AccionMatar();AccionChoca(); }

Implementacin OpenGL
public void Dibuja(){
for(int i=0;i < grupop.cantidad ;i++){
Gl.glPushMatrix();
Gl.glTranslatef(grupop.p[i].pos.x,grupop.p[i].pos.y,grupop.p[i].pos.z);
Gl.glScalef(escalax,escalay,escalaz);
Gl.glColor4f(grupop.p[i].color.x,grupop.p[i].color.y,grupop.p[i].color.z,grupop.p[i].al
pha);
Gl.glBegin(Gl.GL_QUADS);
Gl.glTexCoord2d(1,1); Gl.glVertex3f(0.5f,0.5f,0);
Gl.glTexCoord2d(0,1); Gl.glVertex3f(-0.5f,0.5f,0);
Gl.glTexCoord2d(0,0); Gl.glVertex3f(-0.5f,-0.5f,0);
Gl.glTexCoord2d(1,0); Gl.glVertex3f(0.5f,-0.5f,0);
Gl.glEnd();
Gl.glPopMatrix();
}}

Implementacin OpenGL

Acciones

Rango_Color(float alpha,Dominio tipo,params float[] var)


Rango_Accel(Dominio tipo,params float[] var)
Paso(float dt)
AccionMatar()
AccionChoca()

Implementacin OpenGL

Inicializacin

Sistema PS=new Sistema(Cantidad);


PS.Rango_Color(1,Dominio.Esfera,0,0,0,0.5f,0.1f);
PS.LimiteEdad(10);
PS.Paso(1f);
PS.Rango_Vel(Dominio.Esfera,0,0,0,1f,0.1f);
PS.Emisor(1,Dominio.Punto,0,0,0);

Loop

PS.Actualizar(); PS.Dibuja();

También podría gustarte