ImageVerifierCode 换一换
格式:DOC , 页数:26 ,大小:1.61MB ,
资源ID:6263290      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/6263290.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(火焰 粒子系统 OpenGL.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

火焰 粒子系统 OpenGL.doc

1、 课 程 设 计 报告 题 目 基于openGL的粒子系统——模拟火焰 系 (部) 专 业 班 级 学生姓名 学 号 起止时间: 指导教师(签字) 系 主 任(签

2、字) 提交时间: 一、设计任务及要求: 设计任务: 要 求: 此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。 指导教师签名: 年 月 日 二、指导教师评语: 指导教师签名: 年 月 日 三、成绩

3、 计算机图形学课程设计报告 1.课程设计目的 本学期系统学习了《计算机图形学》这门专业课,在学期期末按课程要求进行实验。粒子系统由Reeves于1983年首次提出,此后越来越受到重视,它的主要优点是可以利用非常简单的体素来构造复杂的物体,为自然现象(如火焰、雨、雪、树林等)的造型提供了强有力的技术手段。 该课程设计以培养我们算法设计与实现的能力为目标,通过实践,使我们

4、了解、掌握计算机图形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境,同时培养我们的思维能力和团队合作能力。 2.课程设计描述及要求 粒子系统的基本思想是用许多形状简单且赋予生命的微小粒子作为基本元素来表示基本物体,侧重于物体的总体形态和特征的动态变化。把物体定义为许多不规则、随机分布的粒子,且每个粒子均有一定的生命周期。随着时间的推移,旧的粒子不断消失(死亡),新的粒子不断加入(生长)。粒子的这种出生、成长、衰老、死亡的过程,能够较好的反应模糊物体的动态特征。一个粒子系统是不断进化的,在生命周期的每一刻,都要完成以下四步: 初始化粒子 更新粒子

5、 删除死粒子 绘制粒子 第一步产生5000个新粒子,他们的每个粒子都有生命周期为2; 第二步根据情况更新,递减一个随机的时间步; 第三步检查粒子的生命期,若为零,则将粒子从系统中删除; 第四步显示粒子系统中的粒子。 要求: 此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。 3.系统开发环境 开发工具:VC 6.0 操作系统:Microsoft Windows 7 4、粒子系统(火焰)的算法原理 4.1 定义粒子的属性 宏

6、定义粒子的最大数目5000,并定义结构体来设置粒子属性,代码如下: #define MAX_PARTICLES 5000 // 粒子数的数目 typedef struct // 创建结构体 { bool active; // float life; // 粒子生命周期 float fade; // 消失的速度 float r; float g; float b; float x; // 坐标 float y; // 坐标 float z; // 坐标

7、 float xi; float yi; float zi; float xg; // X轴加速度 float yg; // Y轴加速度 float zg; // Z轴加速度 } particles; particles particle[MAX_PARTICLES]; // 创建粒子数组 4.2 初始化粒子 利用循环变量loop,loop小于等于最大粒子数目时,则初始化每一个粒子,代码如下: for (loop=0;loop

8、) { particle[loop].active=true; particle[loop].life=2.0f; //生命期 particle[loop].fade=float(rand()%100)/1500.0f+0.002f; //消失速度(随机) particle[loop].r=colors[loop*(4/MAX_PARTICLES)][0]; particle[loop].g=colors[loop*(4/MAX_PARTICLES)][1]; particle[loop].b=colors

9、[loop*(4/MAX_PARTICLES)][2]; particle[loop].xg=0.0f; particle[loop].yg=0.3f; particle[loop].zg=0.0f; } 4.3 粒子消失的过程 (1)定义消失变量,使粒子的生命期递减一个随机的生命步,代码如下: particle[loop].fade=float(rand()%100)/1500.0f+0.002f; (2)粒子的颜色透明度随着生命期的减少而降低,最终消失,代码如下: glColor4f(particle[

10、loop].r,particle[loop].g,particle[loop].b,particle[loop].life); 4.4 绘制及更新粒子 (1)设置粒子的运动状态,代码如下: particle[loop].x+=particle[loop].xi/(slowdown*1050); //X的坐标随X轴速度变化 particle[loop].y+=particle[loop].yi/(slowdown*1050); particle[loop].z+=particle[loop].zi/(slowdown*1050); particle[loop].xi+=partic

11、le[loop].xg; // X轴的速度随X轴的加速度变化 particle[loop].yi+=particle[loop].yg; particle[loop].zi+=particle[loop].zg; particle[loop].life-=particle[loop].fade; // 周期衰减 (2) 当粒子生命期衰减为0时,更新粒子,代码如下: if (particle[loop].life<0.0f) { particle[loop].life=2.0f; particle[loop].fade=flo

12、at(rand()%100)/1500.0f+0.002f; particle[loop].x=0.0f; particle[loop].y=0.0f; particle[loop].z=0.0f; particle[loop].xi=float((rand()%60)-30.0f); particle[loop].yi=float((rand()%60)-30.0f); particle[loop].zi=float((rand()%60)-30.0f); particl

13、e[loop].r=colors[col][0]; //渲染 particle[loop].g=colors[col][1]; //渲染 particle[loop].b=colors[col][2]; //渲染 particle[loop].xg=xg1; particle[loop].yg=yg1; particle[loop].zg=0.0f; } 5、实现交互的原理 5.1 键盘和鼠标主菜单控制火焰颜色 (1)定义颜色数组及设置火焰颜色:

14、 static GLfloat colors[8][3]= // 颜色数组 { {0.0f,0.0f,0.0f},{0.5f,0.75f,1.0f},{1.0f,0.75f,0.5f},{0.75f,1.0f,0.5f}, {1.0f,0.5f,0.75f}, {0.35f,0.8f,0.5f}, {0.55f,0.25f,0.75f},{0.5f,0.5f,0.75f}, }; particle[loop].r=colors[col][0]; //渲染 particle[loop].g=colors[col][1]; //渲染 particle[loop]

15、b=colors[col][2]; //渲染 (2)用键盘的“q”“w”“a”“s”“z”键和主菜单选择数组中相应行的RGB值来改变火焰颜色,代码如下: void keyboard(unsigned char key,int x,int y) //定义键盘功能 { switch(key) { case 'q': { col=3; xg1+=0.05; glutPostRedisplay(); //重绘函数 } break; case 'w': {

16、 col=4; yg1+=0.05; glutPostRedisplay(); } break; case 'a': { col=5; xg1-=0.05; glutPostRedisplay(); }break; case 's': { col=6; yg1-=0.05; glutPostRedisplay(); } break; case 'z': { col=7; glutPos

17、tRedisplay(); } break; default: break; } } void MainMenuHandler(int option) //定义主菜单功能 { switch(option) { case 0: { exit(0); LoadGLTextures(); } break; case 1: { col=1; } break; case 2: { col=2;

18、 }break; default: break; } glutPostRedisplay(); } void MenuHandler() // 主菜单 { int mainMenu; mainMenu = glutCreateMenu(MainMenuHandler); glutSetMenu(mainMenu); glutAddMenuEntry("Exit", 0); glutAddMenuEntry("bright blue", 1); glutAddMenuEntry("croc

19、i", 2); glutAttachMenu(GLUT_RIGHT_BUTTON); } 5.2 键盘控制火焰燃烧方向 (代码可参照键盘控制火焰颜色) 5.3 选择贴图纹理 用键盘输入选择纹理所对应的编号,代码可参照附录源代码中int LoadGLTextures()函数。 6、 程序运行结果 图6.1 图6.2 例如:选择2号:五角星火焰(图6.1) 贴图纹理:五角星(图6.2) 图6.3.1

20、 图6.3.2 例如:选择4号:火焰(图6.3.1) 贴图纹理:火焰(图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”,结果如图

21、6.5.1 与图6.5.2 图6.6.1 图6.6.2 通过改变粒子X与Y轴的初速度和加速度,来改变火焰的燃烧方向,如图6.6.1与图6.6.2 7、总结 在完成基于粒子系统的火焰模拟实验的过程中,我们小组各成员通过分工与合作多种形式,查阅和检索相关文献及资料,最终通过学习基本原理、讨论实验方案、研究重点难点及验证预期结果等过程完成了本次实验。我们实验的特色在于使用键盘和鼠标控制火焰颜色的交互变化,以及使用键盘控制火焰加速度的变化。在本次实验中我们学习并掌握了相关知识,同时也深刻的体会到了

22、合作的重要性。今后,我们一定会更加认真学习。 8、参考资料: 《计算机图形学基础(第2版)》 陆枫 何云峰 编著 太原工业学院精品课程 9、附录:源程序代码清单 #include "stdafx.h" #include #include #include #include #include #include #include "math.h" #define MAX_PARTICLES 5000 // 粒子数的数目

23、 float slowdown=3.0f; float xspeed; // X轴速度 float yspeed; // Y轴速度 float zoom=-40.0f; int a; float xg1; float yg1=0.2f; GLuint loop; // 循环变量 GLuint col=5; // 初始颜色 GLuint texture[1]; // 创建数组存储纹理 typedef struct // 创建结构体 { bool act

24、ive; // float life; // 粒子生命周期 float fade; // 消失的速度 float r; float g; float b; float x; // 坐标 float y; // 坐标 float z; // 坐标 float xi; float yi; float zi; float xg; // X轴加速度 float yg; // Y轴加速度 floa

25、t zg; // Z轴加速度 } particles; particles particle[MAX_PARTICLES]; // 创建粒子数组 static GLfloat colors[8][3]= // 颜色数组 { {0.0f,0.0f,0.0f},{0.5f,0.75f,1.0f},{1.0f,0.75f,0.5f},{0.75f,1.0f,0.5f}, {1.0f,0.5f,0.75f}, {0.35f,0.8f,0.5f}, {0.55f,0.25f,0.75f},{0.5f,0.5f,0.75f}, };

26、 AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图像 { FILE *File=NULL; if (!Filename) { return NULL; } File=fopen(Filename,"r"); if (File) { fclose(File); ret

27、urn auxDIBImageLoad(Filename); } return NULL; } int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理 { int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); printf("q键

28、 xg1+=0.05;(X轴加速度) 荧光黄色\n"); printf("w键 yg1+=0.05;(X轴加速度) 玫瑰粉\n"); printf("a键 xg1-=0.05;(X轴加速度) 荧光绿\n"); printf("s键 yg1-=0.05;(X轴加速度) 亮紫\n"); printf("z键 yg1-=0.05;(X轴加速度) 藕荷色\n"); printf("\n\n"); printf("***Choose the number of the shape***\n"); //选择

29、纹理 printf("---1. Circle\t2. Pentagram\t3. Triangle---\n\n"); printf("---4. Flame\t5. four-pointed Star\t6. Hexagon---\n\n"); scanf("%d",&a); if(a>6) { printf("****Tip:Error!!!Please re-enter after exit!!****\n\n"); exit(0); } switch(a) { case 1: {

30、 if (TextureImage[0]=LoadBMP("Circle.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINE

31、AR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } } break; case 2: { if (TextureImage[0]=LoadBMP("Pentagram.bmp")) { Status=TRUE; glGenTextures(1, &t

32、exture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); 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, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB,

33、 GL_UNSIGNED_BYTE, TextureImage[0]->data); } }break; case 3: { if (TextureImage[0]=LoadBMP("Triangle.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTUR

34、E_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } }break; case 4: { if (TextureImage[0

35、]=LoadBMP("Flame.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage

36、2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } }break; case 5: { if (TextureImage[0]=LoadBMP("four-pointed Star.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]);

37、 glBindTexture(GL_TEXTURE_2D, texture[0]); 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, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYT

38、E, TextureImage[0]->data); } }break; case 6: { if (TextureImage[0]=LoadBMP("Hexagon.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_

39、LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); } }break; } if (TextureImage[0]) { if (TextureImag

40、e[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; } void ReSizeGLScene(GLsizei width, GLsizei height) // 调整并初始化GL窗口 { glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLo

41、adIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f); } void InitGL(GLvoid) // OpenGL的设置 { glClearColor(0.0f,0.0f,0.0f,0.0f); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glDisable(GL_DEPTH_TEST); glEnable(GL_B

42、LEND); glBlendFunc(GL_SRC_ALPHA,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,texture[0]); for (loop=0;loop

43、 particle[loop].active=true; particle[loop].life=2.0f; particle[loop].fade=float(rand()%100)/1500.0f+0.002f; particle[loop].r=colors[loop*(4/MAX_PARTICLES)][0]; particle[loop].g=colors[loop*(4/MAX_PARTICLES)][1]; particle[loop].b=colors[loop*(4/MAX_PARTICLES)][2];

44、 particle[loop].xg=0.0f; particle[loop].yg=0.3f; particle[loop].zg=0.0f; } } void DrawGLScene(GLvoid) // 绘制 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,5,

45、 0,1.5,0, 0,1,0); for (loop=0;loop

46、loop].b,particle[loop].life); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z); glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z); glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z); glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);

47、 glEnd(); particle[loop].x+=particle[loop].xi/(slowdown*1050); //X的坐标随X轴速度变化 particle[loop].y+=particle[loop].yi/(slowdown*1050); particle[loop].z+=particle[loop].zi/(slowdown*1050); particle[loop].xi+=particle[loop].xg; // X轴的速度随X轴的加速度变化 particle[l

48、oop].yi+=particle[loop].yg; particle[loop].zi+=particle[loop].zg; particle[loop].life-=particle[loop].fade; // 周期衰减 if (particle[loop].life<0.0f) { particle[loop].life=2.0f; particle[loop].fade=float(rand()%100)/1500.0f+0.002f; particle[loop].x=

49、0.0f; particle[loop].y=0.0f; particle[loop].z=0.0f; particle[loop].xi=float((rand()%60)-30.0f); particle[loop].yi=float((rand()%60)-30.0f); particle[loop].zi=float((rand()%60)-30.0f); particle[loop].r=colors[col][0]; //渲染 particle[loo

50、p].g=colors[col][1]; //渲染 particle[loop].b=colors[col][2]; //渲染 particle[loop].xg=xg1; particle[loop].yg=yg1; particle[loop].zg=0.0f; } } } glutSwapBuffers(); } void MainMenuHandler(int option) //定义主菜

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服