CComponent_Particle_Emitter

El componente de emisión de partículas se encarga de crear efectos visuales tales como pantallas de humo, fuegos artificiales, disparos, etc.

Para ello, hemos optado por un diseño bastante sencillo compuesto de 2 partes:

  • Una cantidad determinada de partículas: cada una se tratará como una entidad (OJO, entidad, no objeto) que tendrá su posición, su velocidad, su aceleración, su velocidad angular, etc.
  • Un contenedor que gestionará dichas partículas en cada iteración del bucle principal, calculando sus nuevas propiedades (posición, velocidad, color, vida…) y mostrándolas por pantalla en función de dichas propiedades.

particle_emitter

class CComponent_Particle_Emitter: public CComponent
{
  private:
    class CParticle
    {
      private:
        bool active;
        GLfloat life;

        colorf_t color;
        vector3f_t position, velocity, acceleration;
        GLfloat angle, angle_velocity, angle_acceleration;
        vector3f_t scale;
        GLfloat scale_factor;

        string material_name;
    };

    vector<CParticle*> particles;
    void NewParticle(CParticle* p, vector3f go_pos);

  public:
    vector3f last_pos;

    uint max_particles;
    string material_name;

    bool freeze; // Congelar partículas.
    bool stop;   // Dejar de emitir partículas.

    // Cono
    vector3f_t direction;
    GLfloat angle_spread;

    vector3f gravity;
    colorf_t color_adder;

    GLfloat max_vel, min_vel;
    GLfloat max_angle_vel, min_angle_vel;
    GLfloat max_scale, min_scale;

    // Valores iniciales
    GLfloat start_max_life_time, start_min_life_time;
    GLfloat start_max_distance, start_min_distance;
    GLfloat start_max_angle, start_min_angle;
    GLfloat start_max_angle_vel, start_min_angle_vel;
    GLfloat start_max_vel, start_min_vel;
    GLfloat start_max_scale, start_min_scale;
    GLfloat start_max_scale_factor, start_min_scale_factor;
    colorf_t start_max_color, start_min_color;

  public:
    void Start();

    void Stop();
    void Resume();

    void Freeze();
    void UnFreeze();

    void OnRender();
    void OnLoop();
};

Una partícula, en este caso, es una textura en el mundo 3D que siempre mira a la cámara (billboard). Por tanto, una partícula se define con las siguientes propiedades:

  1. Una posición en el espacio.
  2. Una velocidad.
  3. Una aceleración.
  4. Un ángulo de rotación.
  5. Una velocidad angular.
  6. Una aceleración angular (no implementado).
  7. Una escala.
  8. Un factor de escala.
  9. Un color.
  10. Un material o textura.
  11. Un tiempo de vida.

Estos valores vendrán definidos por el componente que gestionará dichas partículas, con propiedades como:

  1. Valores máximos y mínimos actuales (restricciones).
  2. Valores máximos y mínimos iniciales (aleatorio).
  3. Numero máximo de partículas.
  4. Etc.

Finalmente, el funcionamiento del emisor de partículas es el siguiente:

Para iniciar:

Desde i = 0 hasta max_particles
    Crear partícula i con propiedades aleatorias.

Para mostrar por pantalla

Para cada p en particles:Si (p.life > 0) saltamos al siguiente p
    Aplicar textura y color a opengl
    Trasladarse a p.position
    Hacer que la partícula se genere como un sprite o billboard
    Rotar p.angle
    Escalar p.scale
    Dibujar p

Para iterar:

Si está congelado (freeze), salir.
Para cada p en particles:Incrementar p.position a partir de p.velocity
    Incrementar p.velocity a partir de p.acceleration
    // Idem para los ángulos y similar para la escala
    Decrementar el tiempo de vida de p con el tiempo delta (diferencia de tiempo entre última iteración e iteración actual).
    Si la vida es < 0 y no está en modo parado (stop, sin generar nuevas partículas)
    Generar nueva partícula p.
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s