第19课:粒子系统 (参照NeHe)
这次教程中,我们将创建一个简单的粒子系统,并用它来创建一种喷射效果。利用粒子系统,我们可以实现爆炸、喷泉、流星之类的效果,听起来是不是很棒呢!
我们还会讲到一个新东西,三角形带(我的理解就是画很多三角形来组合成我们要的形状),它非常容易使用,而且当需要画很多三角形的时候,它能加快你程序的运行速度。这次教程中,我将教你该如何做一个简单的微粒程序,一旦你了解微粒程序的原理后,再创建例如:火、烟、喷泉等效果将是很轻松的事情。
程序运行时效果如下:
下面进入教程:
我们这次将在第06课代码的基础上修改代码,这次需要修改的代码量不少,希望大家耐心跟着我一步步来完成这个程序。首先打开myglwidget.h文件,将类声明更改如下:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QWidget>
#include <QGLWidget>
class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
//对3个纯虚函数的重定义
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
void keyPressEvent(QKeyEvent *event); //处理键盘按下事件
private:
bool fullscreen; //是否全屏显示
QString m_FileName; //图片的路径及文件名
GLuint m_Texture; //储存一个纹理
static const int MAX_PARTICLES = 1000; //最大粒子数
static const GLfloat COLORS[12][3]; //彩虹的颜色
bool m_Rainbow; //是否为彩虹模式
GLuint m_Color; //当前的颜色
float m_Slowdown; //减速粒子
float m_xSpeed; //x方向的速度
float m_ySpeed; //y方向的速度
float m_Deep; //移入屏幕的距离
struct Particle //创建粒子结构体
{
bool active; //是否激活
float life; //粒子生命
float fade; //衰减速度
float r, g, b; //粒子颜色
float x, y, z; //位置坐标
float xi, yi, zi; //各方向速度
float xg, yg, zg; //各方向加速度
} m_Particles[MAX_PARTICLES]; //存放1000个粒子的数组
};
#endif // MYGLWIDGET_H
首先我们定义了一个静态整形常量MAX_PARTICLES来存放粒子的最大数目,和一个静态GLfloat常量数组来存放彩虹的颜色。接着是一个布尔变量m_Rainbow来表示当前模式是否为彩虹模式,然后是GLuint变量m_Color来表示当前的粒子的颜色,它将在控制粒子颜色在彩虹颜色数组中切换。粒子颜色会与纹理融合,我们用纹理而不用电的重要原因是,点的速度慢,而且挺麻烦的,其次纹理很酷,也好控制。
下面四行是定义了四个浮点变量。m_Slowdown控制粒子移动的快慢,数值越高移动越快,数值越低移动越慢,粒子的速度将影响它们在屏幕上移动的距离,要注意速度慢