使用基本openGL(非GLSL)实现一个面向对象风格粒子系统。
粒子系统基本有两部分构成
- 粒子
- 粒子发生器
一个粒子发生器控制一群粒子的行为,比如一条流水,一团火。
而本文的粒子系统在发生器上多封装一层
- 发生器集合
也就是把多个发生器集合起来,方便同时加入多个相同的粒子系统(比如同时需要很多团火焰)。
下面开始逐层介绍。
粒子类
粒子类代表每个粒子,只有属性没有方法,如下:
class Particle {
public:
GLfloat life; //剩余生命
GLfloat fade; //衰减速度
//颜色
GLfloat r;
GLfloat g;
GLfloat b;
//位置
GLfloat x;
GLfloat y;
GLfloat z;
//速度
GLfloat xVel;
GLfloat yVel;
GLfloat zVel;
//加速度
GLfloat xAcc;
GLfloat yAcc;
GLfloat zAcc;
};
这就是本粒子系统中粒子的全部属性。而粒子发生器通过控制每个例子的以上属性来控制整个粒子群。
发生器是一个基类,而通过其不同的继承类实现不同效果的粒子系统。基类如下:
class Generator{
public:
//粒子初始化与再造函数
virtual void particleInit(int i)=0;
//粒子更新函数
virtual void particleUpdate(int i)=0;
//粒子渲染函数
void particleDisplay(int i){
glColor4f(
particles[i].r,
particles[i].g,
particles[i].b,
particles[i].life/particleLife
);
glPointSize(particleSize);
glBegin(GL_POINTS);
glVertex3f(
particles[i].x,
particles[i].y,
particles[i].z);
glEnd();
}
//发生器循环函数
void particleMainLoop(){
for(int i = 0; i < particleCou