Sistema de Partículas I
Humo, explosiones, nubes, chispas, lluvia, sangre son algunos efectos que se benefician de un sistema de partículas.
- Performance y Requerimientos
Al crear un sistema de partículas es importante considerar todos los posibles parametros que sabremos que serán afectados en el sistema en algún momento del juego, y crear esa flexibilidad dentro del sistema.
- Jerarquía del sistema dentro del motor
- Multi-Rendering
Existen muchos requerimientos, pero para empezar no es necesario saberselos todos. En esta serie siempre se hará referencia a un sistema de partículas en 2 dimensiones, dado que llevarla a 3 es simplemente agregar una componente, para el caso de los algoritmos (renderizar cada partícula es muy distinto, claro está). Como dije antes el código está escrito en C++ y usaré el motor SDL para la tarea simple de visualizar las partículas. La elección del motor depende únicamente del efecto visual que se desee para las partículas, en esta serie el cometido es el sistema de partículas en sí y no la parte de visualización de las mismas, por este motivo el motor a usar da lo mismo. También voy a considerar las partículas como pixeles, para facilitar el código.
Las Partículas
Una partícula es, en general, un solo punto en el espacio. A este punto se le asigna atributos o características. Las características más comunes de una partícula son:
- posición
- energía
- velocidad
- dirección
- tiempo de vida
active:
class particle {
public:
bool active;
int color;
vector pos;
vector dir;
vector oldpos;
vector vel;
float energy;
reload();
update(float& friction, float& gravity);
rendering();
}
La partícula puede estar cargada en memoria, aún cuando muerta. Este campo indica cada caso.
color:
Define el color como un RGB (para los pixeles). Puede usarse para almacenar el índice de un arreglo de bitmaps creado previamente para colorear cada partícula.
energy:
Como la misma etiqueta, registra la energía actual de la partícula. Evita el tener 2 campos como 'lifetime' y 'age', a medida que la partícula actúa en el sistema la energía se va agotando o incrementando; cuando energy<=o la partícula ha muerto. Pero si esto es así, entonces para qué está la etiqueta 'active' ??? Bueno, por algo la puse ;) . Este campo será reemplzado por una constante en las explosiones simples (sin considerar aceleración).
oldpos: Es el vector posición anterior de la partícula, antes de haber sido modificado. No será usado en las explosiones (almenos en las mas comunes). Este campo es muy usado por ejemplo para modelar chispas y en algunos casos, llamaradas de fuego. El resto de los campos, hablan por sí solos.
Ahora veamos las funciones:
reload( ): Optimiza el rendimiento del sistema, evita las operaciones new y delete. Resucita una partícula muerta sin pedir memoria.
update( ): Actualiza la física de la partícula, sus valores pueden ser modificados en base a los parámetros que recibe (gravedad y fricción).
rendering( ): Es el encargado de renderizar el comportamiento de la partícula. La clase vector debe incluir, aparte de lo básico como vector de 2 componentes, una función para normalizar el vector, que será usada en los algoritmos de explosión para normalizar el vector dirección, como se verá mas adelante.
Esto es todo por el primer número, suficiente para empezar con las explosiones en el siguiente capítulo. Si al avanzar veo que quedó algo colgado, actualizaré el capítulo correspondiente para agregarlo, asi que hasta no terminar la serie los capítulos pueden ser modificados.
4 Comments:
El codigo se ve con letra muy pequeña, no puedes aumentarlo?
La fuente no es pequeña, pero puede variar dependiendo del navegador. Me baso en el FireFox, lo mas probable es que tengas IE, porque acabo de probarla con Netscape y también va bien.
Salu2
no entiendo por que usas un campo color, ¿el color de cada particula es fijo?
No entiendo a que te referís con lo de 'fijo'. En el capítulo 3 voy a mostrar un ejemplo con una paleta básica para la explosión, y ahi ves como uso el campo color.
Salu2
Publicar un comentario
<< Home