opengl粒子系统实现.docx
- 文档编号:14513884
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:25
- 大小:57.18KB
opengl粒子系统实现.docx
《opengl粒子系统实现.docx》由会员分享,可在线阅读,更多相关《opengl粒子系统实现.docx(25页珍藏版)》请在冰点文库上搜索。
opengl粒子系统实现
opengl粒子系统实现
OpenGL进阶(六)-粒子系统
一、提要
有一款例子特效软件叫做particleillution,在影视后期和游戏制作领域都可以用到,
相信很多人都接触过,今天我们用SDL+OpenGL来实现例子效果。
确保你搞定了物理模拟的代码~
代码下载
二、原理简介
所谓的例子系统,就是同时控制一大堆类似的对象,这些对象可能是形体,可能是图片,
有着不同的特征(寿命,速度,位置)。
有了之前的基础,我们可以很轻易地搞定今天的东
西。
三、代码清单
首先是粒子的头文件,我直接写成结构体了,里面有一些基本的属性。
[cpp]viewplaincopy
1./***************************************************************************
**
2.Copyright:
2012,ustcAllrightsreserved.
3.contact:
k283228391@
4.Filename:
particle.h
5.Description:
Particalinopengl.
6.Author:
SilangQuan
7.Version:
1.0
8.Date:
2012.12.20
9.***************************************************************************
**/
10.#ifndefPARTICLE_H
11.#definePARTICLE_H12.#include"vector3d.h"13.typedefstruct
14.{
15.floatr;
16.floatg;
17.floatb;
18.floatalpha;19.}Color;
20.
21.typedefstruct
22.{
23.Vector3Dposition;24.Vector3Dvelocity;25.Vector3Dacceleration;26.Colorcolor;27.floatage;
28.floatlife;29.floatsize;30.}Particle;
31.
32.#endif//PARTICLE_H
[cpp]viewplaincopy
1./***************************************************************************
**
2.Copyright:
2012,ustcAllrightsreserved.
3.contact:
k283228391@4.Filename:
particle.h5.Description:
Particalinopengl.
6.Author:
SilangQuan7.Version:
1.0
8.Date:
2012.12.209.***************************************************************************
**/
10.#ifndefPARTICLE_H11.#definePARTICLE_H12.#include"vector3d.h"13.typedefstruct
14.{
15.floatr;
16.floatg;
17.floatb;
18.floatalpha;
19.}Color;
20.
21.typedefstruct
22.{
23.Vector3Dposition;24.Vector3Dvelocity;25.Vector3Dacceleration;26.Colorcolor;
27.floatage;
28.floatlife;
29.floatsize;
30.}Particle;
31.
32.#endif//PARTICLE_H
我们用球体来模拟例子,所以size表示的就是球体的半径。
接下来是粒子系统类(类名拼写错了*-*)
[cpp]viewplaincopy
1./***************************************************************************
**
2.Copyright:
2012,ustcAllrightsreserved.
3.contact:
k283228391@4.Filename:
particalsystem.h5.Description:
Particalinopengl.6.Author:
SilangQuan
7.Version:
1.0
8.Date:
2012.12.20
9.***************************************************************************
**/
10.
11.#ifndefPARTICALSYSTEM_H12.#definePARTICALSYSTEM_H13.#include
14.#include
15.#include
16.#include
17.#include
18.#include
19.#include
20.#include"particle.h"
21.#definePI3.1415926
22.usingnamespacestd;
23.classParticalSystem
24.{
25.public:
26.ParticalSystem();27.ParticalSystem(int_count,float_gravity){ptlCount=_count;gravity=_g
ravity;};
28.voidinit();
29.voidsimulate(floatdt);30.voidaging(floatdt);31.voidapplyGravity();32.voidkinematics(floatdt);33.voidrender();
34.virtual~ParticalSystem();35.protected:
36.private:
37.intptlCount;
38.floatgravity;
39.GLUquadricObj*mySphere;40.vector
42.
43.#endif//PARTICALSYSTEM_H
[cpp]viewplaincopy
1./***************************************************************************
**
2.Copyright:
2012,ustcAllrightsreserved.
3.contact:
k283228391@4.Filename:
particalsystem.h5.Description:
Particalinopengl.6.Author:
SilangQuan
7.Version:
1.0
8.Date:
2012.12.20
9.***************************************************************************
**/
10.
11.#ifndefPARTICALSYSTEM_H
12.#definePARTICALSYSTEM_H13.#include
14.#include
15.#include
16.#include
17.#include
18.#include
19.#include
20.#include"particle.h"21.#definePI3.141592622.usingnamespacestd;23.classParticalSystem24.{
25.public:
26.ParticalSystem();27.ParticalSystem(int_count,float_gravity){ptlCount=_count;gravity=_g
ravity;};
28.voidinit();29.voidsimulate(floatdt);30.voidaging(floatdt);31.voidapplyGravity();32.voidkinematics(floatdt);33.voidrender();34.virtual~ParticalSystem();35.protected:
36.private:
37.intptlCount;
38.floatgravity;
39.GLUquadricObj*mySphere;40.vector
42.
43.#endif//PARTICALSYSTEM_H
解释一下几个重要函数:
init:
做一些例子系统的初始化工作;
aging:
计算粒子的年龄;
applyGravity:
向粒子施加重力;
kinematics:
这个单词的意思是运动学,所以就是负责管理粒子的加速,位移;
simulate:
例子模拟的总负责函数;
render:
渲染粒子;
然后来看函数是怎么实现的:
[cpp]viewplaincopy
1./***************************************************************************
**
2.Copyright:
2012,ustcAllrightsreserved.3.contact:
k283228391@
4.Filename:
particalsystem.Cpp5.Description:
Particalinopengl.6.Author:
SilangQuan
7.Version:
1.0
8.Date:
2012.12.22
9.***************************************************************************
**/
10.
11.#include"particalsystem.h"12.
13.ParticalSystem:
:
ParticalSystem()14.{
15.//ctor
16.}
17.
18.ParticalSystem:
:
~ParticalSystem()19.{
20.//dtor
21.}
22.
23.voidParticalSystem:
:
init()24.{
25.inti;
26.srand(unsigned(time(0)));27.Colorcolors[3]={{0,0,1,1},{1,0,1,1}};28.for(i=0;i 30.//theta=(rand()%361)/360.0*2*PI; 31.Particletmp={Vector3D(0,0,0),Vector3D(((rand()%50)-26.0f),((rand()% 50)-26.0f),((rand()%50)-26.0f)),Vector3D(0,0,0),colors[rand()%2],0.0f,0.5+0.05*(ran d()%10),0.3f}; 32.particles.push_back(tmp); 33.} 34.mySphere=gluNewQuadric(); 35.} 36.voidParticalSystem: : simulate(floatdt) 37.{ 38.aging(dt); 39.applyGravity(); 40.kinematics(dt); 41.} 42.voidParticalSystem: : aging(floatdt) 43.{ 44.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 45.{ 46.iter->age+=dt; 47.if(iter->age>iter->life) 48.{ 49.iter->position=Vector3D(0,0,0); 50.iter->age=0.0; 51.iter->velocity=Vector3D(((rand()%30)-15.0f),((rand()%30)-11.0f), ((rand()%30)-15.0f)); 52.} 53.} 54.} 55.voidParticalSystem: : applyGravity() 56.{ 57.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 58.iter->acceleration=Vector3D(0,gravity,0);59.} 60. 61.voidParticalSystem: : kinematics(floatdt) 62.{ 63.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 64.{ 65.iter->position=iter->position+iter->velocity*dt;66.iter->velocity=iter->velocity+iter->acceleration*dt;67.} 68.} 69.voidParticalSystem: : render() 70.{ 71. 72.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 73.{ 74.floatalpha=1-iter->age/iter->life;//calculatethealphavalue accordingtotheageofparticle. 75.Vector3Dtmp=iter->position;76.glColor4f(iter->color.r,iter->color.g,iter->color.b,alpha); 77.glPushMatrix(); 78.glTranslatef(tmp.x,tmp.y,tmp.z);79.gluSphere(mySphere,iter->size,32,16);80.glPopMatrix(); 81.} 82. 83.} [cpp]viewplaincopy 1./*************************************************************************** ** 2.Copyright: 2012,ustcAllrightsreserved.3.contact: k283228391@ 4.Filename: particalsystem.Cpp 5.Description: Particalinopengl.6.Author: SilangQuan 7.Version: 1.0 8.Date: 2012.12.22 9.*************************************************************************** **/ 10. 11.#include"particalsystem.h" 12. 13.ParticalSystem: : ParticalSystem()14.{ 15.//ctor 16.} 17. 18.ParticalSystem: : ~ParticalSystem()19.{ 20.//dtor 21.} 22. 23.voidParticalSystem: : init() 24.{ 25.inti; 26.srand(unsigned(time(0))); 27.Colorcolors[3]={{0,0,1,1},{1,0,1,1}};28.for(i=0;i 29.{ 30.//theta=(rand()%361)/360.0*2*PI;31.Particletmp={Vector3D(0,0,0),Vector3D(((rand()%50)-26.0f),((rand()% 50)-26.0f),((rand()%50)-26.0f)),Vector3D(0,0,0),colors[rand()%2],0.0f,0.5+0.05*(ran d()%10),0.3f}; 32.particles.push_back(tmp);33.} 34.mySphere=gluNewQuadric(); 35.} 36.voidParticalSystem: : simulate(floatdt)37.{ 38.aging(dt); 39.applyGravity(); 40.kinematics(dt); 41.} 42.voidParticalSystem: : aging(floatdt)43.{ 44.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 45.{ 46.iter->age+=dt; 47.if(iter->age>iter->life)48.{ 49.iter->position=Vector3D(0,0,0);50.iter->age=0.0; 51.iter->velocity=Vector3D(((rand()%30)-15.0f),((rand()%30)-11.0f), ((rand()%30)-15.0f)); 52.} 53.} 54.} 55.voidParticalSystem: : applyGravity()56.{ 57.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 58.iter->acceleration=Vector3D(0,gravity,0);59.} 60. 61.voidParticalSystem: : kinematics(floatdt) 62.{ 63.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 64.{ 65.iter->position=iter->position+iter->velocity*dt;66.iter->velocity=iter->velocity+iter->acceleration*dt;67.} 68.} 69.voidParticalSystem: : render() 70.{ 71. 72.for(vector : iteratoriter=particles.begin();iter! =particles.en d();iter++) 73.{ 74.floatalpha=1-iter->age/iter->life;//calculatethealphavalue accordingtotheageofparticle. 75.Vector3Dtmp=iter->position; 76.glColor4f(iter->color.r,iter->color.g,iter->color.b,alpha);77.glPushMatrix(); 78.glTranslatef(tmp.x,tmp.y,tmp.z); 79.gluSphere(mySphere,iter->size,32,16);80.glPopMatrix(); 81.} 82. 83.} 实现还是比较简单的,下面渲染看一下^^. 首先要在initGL函数中添加两句话: [cpp]viewplaincopy 1.glEnable(GL_BLEND); 2.glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); [cpp]viewplaincopy 1.glEnable(GL_BLEND); 2.glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 这样透明度才会有效。 接
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opengl 粒子 系统 实现
![提示](https://static.bingdoc.com/images/bang_tan.gif)