火焰粒子系统OpenGL_第1页
火焰粒子系统OpenGL_第2页
火焰粒子系统OpenGL_第3页
火焰粒子系统OpenGL_第4页
火焰粒子系统OpenGL_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告题系(部)专业班级学生姓名学号基于的粒子系统起止时间:指导教师(签字)系主任(签字)提交时间:一、设计任务及要求:设计任务:要求:此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。指导教师签名:年月 日二、指导教师评语:指导教师签名:年月曰三、成绩计算机图形学课程设计报告1. 课程设计目的本学期系统学习了计算机阁形学这门专业课,在学期期末按课程耍求进行实验。粒子系统 由reeves于1983年首次提出,此后越来越受到重视,它的主要优点是可以利用非常简单的体素来 构造复杂的物体,

2、为自然现象(如火焰、雨、雪、树林等)的造型提供了强有力的技术手段。该课程设计以培养我们算法设计与实现的能力为目标,通过实践,使我们了解、掌握计算机图 形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境,同时培养我们的思维 能力和团队合作能力。2. 课程设计描述及要求粒子系统的基本思想是用许多形状简单且赋予生命的微小粒子作为基本元素來表示基本物体,侧重 于物体的总体形态和特征的动态变化。把物体定义为许多不规则、随机分布的粒子,且每个粒子均 有一定的生命周期。随着时间的推移,旧的粒子不断消失(死亡),新的粒子不断加入(生长)。 粒子的这种出生、成长、衰老、死亡的过程,能够较好的反应

3、模糊物体的动态特征。一个粒子系统 是不断进化的,在生命周期的每-刻,都要完成以下四步:初始化粒子更新粒子删除死粒子绘制粒子第一步产生5000个新粒子,他们的每个粒子都有生命周期为2;第二步根据情况更新,递减一个随机的时间步;第三步检查粒子的生命期,若为零,则将粒子从系统中删除;第四步显示粒子系统中的粒子。要求:此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、 贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。3. 系统开发环境开发工具:vc6.0操作系统:microsoft windows 74. 粒子系统(火焰)的算法原理4.1定义粒

4、子的属性宏定义粒子的最大数r 5000,并定义结构体来设置粒子属性,代码如丁: #define max_particles 5000/ 粒子数的数目typedef structf/创建结构体boolactive;/floatlife;/粒子生命周期floatfade;/消失的速度floatr;floatg;floatb;floatx;/坐标floaty;/坐标floatz;/坐标floatxi;floatyi;floatzi;floatxg;/x轴加速度floatyg;/y轴加速度floatzg;/z轴加速度particles;particles particlemax_particles;/

5、 创建粒子数组4.2初始化粒子利用循环变量loop,loop小于等于最大粒子数目时,则初始化每一个粒子,代码如下: for (loop=0;loop<max_particles;loop+)particle|loop|.active=true; particlefloop.life=2.0f;/生命期particleloop.fade=float(rand()%l00)/1500.0f+0.002f; "消失速度(随机) particleloop.r=colorsloop*(4/max_particles)0;particleloop .g=colorsloop*(4/max_

6、particles) 1 ; particle) loop 1 .b=colors loop*(4/m ax.particles) 2;particleioop.xg=o.of; particleloop.yg=0.3f; particle loop .zg=0.0f;4.3粒子消失的过程(1) 定义消失变量,使粒子的生命期递减一个随机的生命步,代码如下: particle loop .fade=float(rand()%l 00)/1500.0f+0.002f;(2) 粒子的颜色透明度随着生命期的减少而降低,最终消失,代码如丁:glcolor4f(particle|loop|.r,parti

7、cle|loop|.g,particle|loop|.b,particle| loop|.life);4.4绘制及更新粒子 (1)设置粒子的运动状态,代码如下:particle loop. x+=particleloop. xi/(slowdown* 1050);/x 的坐标随 x 轴速度变化particleloop. y+二particleloop, yi/(slowdown本1050);particleloop. z+=partic1e1oop. zi/(slowdown本1050);particle loop. xi+=particleloop. xg; / x 轴的速度随 x 轴的加速

8、度变化particleloop. yi+=particleloop. yg;/周期衰减particleloop. zi +=partic1e1oop. zg; particleloopl life-=particleloop. fade;(2)当粒子生命期衰减为0时,更新粒子,代码如下: if (particleloop .life<o.of)particleloop .life=2.0f;particleloop .fade=float(rand()% 100)/1500.0f+0.002f; particleloop .x=0.0f; particlefloopl .y=o.of;

9、particlefloopl .z=o.of;particleloop.xi=float(rand()%60)-30.0f);particleloop.yi=float(rand()%60)-30.0f);particleloop.zi=float(rand()%60)-30.0f);particlefloopl.r=colorsfcoll0;/渲染particleloop .g=colorscoll;/渲染particleloop .b=colorscol 2;/渲染particleloop.xg=xgl;particlefloopl .yg=ygl;5、实现交互的原理5.1键盘和鼠标主菜单

10、控制火焰颜色(1)定义颜色数组及设置火焰颜色: static glfloat colors83=/ 颜色数组o.of,o.of,o.of,o.5f,o.75f,1 .of,1 .of,o.75f,o.5f,0.75f,1 .of,o.5f, l.of,o.5f,o.75f, o.35f,o.8f,o.5f, 0.55f,0.25f,0.75f,0.5f,0.5f,0.75f"渲染 "渲染 /渲染particleloop. r=colorscol0; particleloop. g=colorscol1; particleloop. b=colorscol2;(2)用键盘的“

11、q” “w” “a” “s” “z”键和主菜单选择数组中相应行的rgb值来改变火焰颜/定义键盘功能色,代码如下:void keyboard(unsigned char key, int x, int y)switch(key) case q :col=3; xgl+=0. 05;glutpostredisplay () ;/重绘函数 break;case w :col=4; ygl+=0. 05;glutpostredisplay();break;case a :col=5; xgl-=o. 05;glutpostredisplay();break;case ,s':col=6;ygl

12、-=0.05;glutpostredisplay();break;case ' z :col=7;glutpostredisplay ();break;default:break;/定义主菜单功能void mainmenuhandler(int option) switch (option)case 0:exit (0):loadgltextureso ; break; case 1:col=l: break; case 2:col=2;break;default:break;glutpostredisplay();void menuhandler ()/ 主菜单int mainmen

13、u;mainmenu = glutcreatemenu(mainmenuhandler):glutsetmenu(mainmenu); glutaddmenuentry(exit", 0); glutaddmenuentry("bright blue, 1); glutaddmenuentry ccroci”,2);glutattachmenu(glut_right_button);5.2键盘控制火焰燃烧方向 (代码可参照键盘控制火焰颜色)5.3选择贴图纹理用键盘输入选择纹理所对应的编号,代码可参照附录源代码中int loadgltextureso函数。6、程序运行结果d:

14、我的学习图形学opengl家庭作业粒子系统2终极版2debugs子系统2.exe"(x轴加速度) (x鉀加速度) (x铀加速度) (x獅口速度) (x铀加速度)建建建建建lqwla:slzxgl+=0.05; tx罕田 ygl+=0.05; (x5ffl xgl-=0.05; (x5函 ygl-=0.05; (x5j ygl-=0.05; (x轴口回 22*choose the number of the shape*1. circle 2.pentagram 3.triangle 4- flane 5.fourpointed star 6.hexagon 6. 1图 6. 2例如:

15、选择2号:五角星火焰(图6.1)贴图纹理:五角星(图6. 2)6. 3.1例如:选择4号:火焰(图6. 3.1)6. 3.2贴图纹理:火焰(图6. 3. 2)图 6. 4. 1图 6. 4. 2图 6. 4. 3按键改变的火焰颜色(图6. 4. 1 图6. 4. 2 图6. 4. 3 )图 6.5.1图 6.5.2鼠标主菜单,改变火焰颜色,和退出。例如选择“bright blue”,结果如阁6.5.1与网6.5.2图 6.6.1图 6.6.2通过改变粒子x与y轴的初速度和加速度,来改变火焰的燃烧方向,如图6. 6.1与图6. 6. 27、总结在完成基于粒子系统的火焰模拟实验的过程屮,我们小组各

16、成员通过分工与合作多种形式,查 阅和检索相关文献及资料,最终通过学基本原理、讨论实验方案、研究重点难点及验证预期结果 等过程完成了木次实验。我们实验的特色在于使用键盘和鼠标控制火焰颜色的交互变化,以及使用键盘控制火焰加速度的变化。在本次实验中我们学习并掌握了相关知识,同时也深刻的体会到了合 作的重要性。今后,我们一定会更加认真学习。8、参考资料:计算机图形学棊础(第2版)陆枫何云峰编著太原工业学院精品课程9、附录:源程序代码清单#include /zstdafx. h,z includewindows. h>#includestdio. h> include <gl/gl.

17、h> include <gl/glu. h> include <gl/glut. h> tfinclude <gl/glaux. h> ttinclude "math. h,z/粒子数的数目floatslowdown=3. of;floatxspeed;floatyspeed;floatzoom=-40. of;int <a;floatxgl;floatygl:0.2f;gluintloop;gluintcol=5;gluinttexture1;/ x轴速度 / y轴速度/循环变量 /初始颜色 /创建数组存储纹理define max_p

18、articles 5000typedef struct/创建结构体boolactive;/floatlife;/粒子生命周期floatfade;/消失的速度float r;floatg;floatb;floatx;/坐标floaty;/坐标floatz;/坐标floatxi;floatyi;floatzi;floatxg;/x轴加速度floatyg;/ y轴加速度floatzg;/ z轴加速度particles;particles particlemax_particles; / 创建粒子数组static glfloat colors8 3=/ 颜色数组0. of,0. of, 0. of,

19、0. 5f, 0. 75f, 1. of,1. of, 0. 75f, 0. 5f, 0. 75f, 1. of, 0. 5f,1. of, 0. 5f, 0. 75f,0. 35f, 0. 8f, 0. 5f,0. 55f, 0. 25f, 0. 75f, 0. 5f, 0. 5f, 0. 75f,;aux_rgbimagerec *loadbmp(char *filename)/ 载入位图图像file *file=null; if (!filename)return null;file=fopen(filename, r); if (file)fclose(file);return aux

20、dibimageload(filename);return null;int loadgltextures()成纹理/载入位图(调用上面的代码)并转换int status=false;xgl+=0. 05;(x轴加速度)荧光黄色11");ygl+=0. 05;(x轴加速度)玫瑰粉n");xgl-=0. 05;(x轴加速度)荧光绿n");ygl-=0. 05;(x轴加速度)亮紫n");ygl-=0. 05;(x轴加速度)藕荷色n");auxrgbimagerec *textureimagel; memset(texturelraage, 0, s

21、izeof(void *)*1); printf (q 键printf(w键 printf(a 键 printf(s 键 printf(z 键printf cnn/s);printf (z/*choose the number of the shape*n");/选择纹理printf c1. circlet2. pentagramt3. trianglenn,z);printf ("4. flamet5. four-pointed start6. hexagonnn");scanf ("%d", &a);if(a>6)printf

22、(*tip:error!plea«se re-enter after exit! !*nn); exit (0);switch(a)case 1:if (textureimage0=loadbmp("circle, bmp)status=true;glgentextures(1, &texture0);glbindtexture(gltexture2d, texture0);gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_texture_2d,

23、gl_texture_min_filter, gl_linear); glteximage2d(gl_texture_2d,0,3,texturelmageeo->sizex,texturelmage0->sizey, 0, gl_rgb, gl_unsigned_byte, texturelmageeo->data); break; case 2:if (texturelmage 0 =loadbmp ("pentagram. bmp)status=true;glgentextures(1, &texture0);glbindtexture(gltextu

24、re2d, texture0);gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);glteximage2d(gl_texture_2d,0,3,textureimageo->sizex,textureimageo-sizey, 0, gl_rgb, gl_unsigned_byte, textureimageo-data);break;case 3:if (textureimag

25、e0=loadbmp(triangle. bmp)status=true;glgentextures(1, &texture0);glbindtexture(gl_texture_2d, texturee0):gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear); glteximage2d(gl_texture_2d,0,3,textureimageo->sizex,text

26、ureimageo-sizey, 0, gl_rgb, gl_unsigned_byte, textureimageo-data);break;case 4:if (texturelmage0 =loadbmp(z,flame. bmp")status=true;glgentextures (1, &texture0);glbindtexture(gl_texture_2d, texture 0):gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_textu

27、re_2d, gl_texture_min_filter, gl_linear); glteximage2d(gl_texture_2d,0,3,texturelmage0->sizex,texturelmage0->sizey, 0, gl_rgb, gl_unsigned_byte, texturelmage0->data);break;case 5:if (textureimage0=loadbmp (four-pointed star. bmp)status=true;glgentextures(1, &texture0);glbindtexture(gl_t

28、exture_2d, texture0);gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear); glteximage2d(gl_texture_2d,0,3,texturelmage0->sizex,textureimageo->sizey, 0, glrgb, glunsignedbyte, texturelmage0->data);break;case 6:if (

29、texturelmage0=loadbmp("hexagon, bmp")status=true;glgentextures(1, &texture0);glbindtexture(gl_texture_2d, texture0);gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_linear); gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_linear); glteximage2d(gl_texture_2d,0,3,texture

30、lmage0->sizex,texturelmage0->sizey, 0, glrgb, glunsignedbyte, texturelmage0->data);break;if (texturelmage0)if (texturelmage 0 mata)free (texturelmage0->data);free(texturelmage0);return status;void resizeglscene(glsizei width, glsizei height)/调整并初始化gl窗口glviewport(0, 0, width, height); glm

31、atrixmode(gl_projection): glloadldentity ();gluperspective (45. of, (glfloat)width/(glfloat)height, 0. if, 200. of);void initgl(glvoid)/ opengl的设置glclearcolor (0. of, 0. of, 0. of, 0. of);glshademodel(gl_sm00th);glcleardepth(l. of);gldisable(gl_depth_test);glenable(gl_blend);glblendfunc(gl_src_alpha

32、, gl_one);glhint(gl_perspective_correction_hint, gl_nicest): glhint(gl_point_smooth_hint, gl_nicest); glenable(gl_texture_2d);loadgltextures ();glbindtexture(gl_texture_2d, texture0);for (loop=0;loop<max_particles;loop+)particleloop. active=true; particleloop. life=2. of;particleloop. fade=float(

33、rand()%100)/1500. 0f+0. 002f; particleloop. r=colorsloop*(4/max_particles)0; particleloop. g=colorsloop*(4/max_particles)1; particleloop. b=colorsloop*(4/max_particles)2;particleloop. xg=0. of; particleloop. yg=0. 3f; particleloop. zg=0. of;/绘制void drawglscene(glvoid)glclear(gl_color_buffer_bit | gl

34、_depth_buffer_bit); glmatrixmode(gl_modelview); glloadldentity(); glulookat (0, 0, 5,0, 1. 5, 0,0, 1, 0);for (loop=0;loop<max_particles;loop+)if (particleloop, active)float x=particleloop. x; float y=particleloop. y; float z=particleloop. z+zoom;glcolor4f(particleloop, r, particleloop, g, particl

35、eloop, b, particleloop, life);glbegin(gl_triangle_strip);gltexcoord2d(l, 1) ; glvertex3f (x+0. 5f, y+0. 5f, z); gltexcoord2d(0, 1); glvertex3f(x0. 5f, y+0. 5f, z); gltexcoord2d(l, 0); glvertex3f (x+0. 5f, y-0. 5f, z); gltexcoord2d(0, 0); glvertex3f (x-0. 5f, y-0. 5f, z);glendo ;particle loop. x+=par

36、ticleloop. xi/(slowdown*1050) ;/x 的坐标随 x 轴速度变化particle loop. y+=particle loop. yi/(slowdown*1050); particle loop. z+=par t i c 1 e 1 oop. zi/(slowdown*1050);/ x轴的速度随x轴的加速度变particleloop. xi+=particleloop. xg;particle loop. yi+=particle loop. yg; particleloop. zi+=particleloop. zg; particleloop. life-

37、=particleloop. fade; / 周期衰减if (particleloop. life<0. of)particleloop. life=2. of;particleloop. fade=float(rand()%100)/1500. 0f+0. 002f; particleloop. x=0. of; particleloop. y=0. of; particleloop. z=0. of;particleloop. xi=float(rand()%60)-30. of); particleloop. yi=float(rand()%60)-30. of); particleloop. zi=float(rand()%60)-30. of);particle loop. r=colorscol 0;/渲染particle loop. g=colorscol 1;/渲染part

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论