已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课 程 设 计 报告题 目 基于openGL的粒子系统模拟火焰 系 (部) 专 业 班 级 学生姓名 学 号 起止时间:指导教师(签字) 系 主 任(签字) 提交时间:一、设计任务及要求:设计任务:要 求: 此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。指导教师签名: 年 月 日 二、指导教师评语:指导教师签名: 年 月 日 三、成绩 计算机图形学课程设计报告1.课程设计目的本学期系统学习了计算机图形学这门专业课,在学期期末按课程要求进行实验。粒子系统由Reeves于1983年首次提出,此后越来越受到重视,它的主要优点是可以利用非常简单的体素来构造复杂的物体,为自然现象(如火焰、雨、雪、树林等)的造型提供了强有力的技术手段。该课程设计以培养我们算法设计与实现的能力为目标,通过实践,使我们了解、掌握计算机图形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境,同时培养我们的思维能力和团队合作能力。2.课程设计描述及要求粒子系统的基本思想是用许多形状简单且赋予生命的微小粒子作为基本元素来表示基本物体,侧重于物体的总体形态和特征的动态变化。把物体定义为许多不规则、随机分布的粒子,且每个粒子均有一定的生命周期。随着时间的推移,旧的粒子不断消失(死亡),新的粒子不断加入(生长)。粒子的这种出生、成长、衰老、死亡的过程,能够较好的反应模糊物体的动态特征。一个粒子系统是不断进化的,在生命周期的每一刻,都要完成以下四步:初始化粒子更新粒子删除死粒子绘制粒子第一步产生5000个新粒子,他们的每个粒子都有生命周期为2;第二步根据情况更新,递减一个随机的时间步;第三步检查粒子的生命期,若为零,则将粒子从系统中删除;第四步显示粒子系统中的粒子。要求:此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。3系统开发环境开发工具:VC 6.0操作系统:Microsoft Windows 74、粒子系统(火焰)的算法原理4.1 定义粒子的属性宏定义粒子的最大数目5000,并定义结构体来设置粒子属性,代码如下:#defineMAX_PARTICLES5000/ 粒子数的数目typedef struct/ 创建结构体boolactive;/ floatlife;/ 粒子生命周期floatfade;/ 消失的速度floatr;floatg;floatb;floatx;/ 坐标floaty;/ 坐标floatz;/ 坐标floatxi; floatyi; floatzi; floatxg;/ X轴加速度floatyg;/ Y轴加速度floatzg;/ Z轴加速度particles;particles particleMAX_PARTICLES;/ 创建粒子数组4.2 初始化粒子 利用循环变量loop,loop小于等于最大粒子数目时,则初始化每一个粒子,代码如下:for (loop=0;loopMAX_PARTICLES;loop+)particleloop.active=true;particleloop.life=2.0f;/生命期particleloop.fade=float(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.0f;particleloop.yg=0.3f;particleloop.zg=0.0f;4.3 粒子消失的过程(1)定义消失变量,使粒子的生命期递减一个随机的生命步,代码如下:particleloop.fade=float(rand()%100)/1500.0f+0.002f;(2)粒子的颜色透明度随着生命期的减少而降低,最终消失,代码如下:glColor4f(particleloop.r,particleloop.g,particleloop.b,particleloop.life);4.4 绘制及更新粒子(1)设置粒子的运动状态,代码如下:particleloop.x+=particleloop.xi/(slowdown*1050); /X的坐标随X轴速度变化particleloop.y+=particleloop.yi/(slowdown*1050);particleloop.z+=particleloop.zi/(slowdown*1050);particleloop.xi+=particleloop.xg;/ X轴的速度随X轴的加速度变化particleloop.yi+=particleloop.yg;particleloop.zi+=particleloop.zg;particleloop.life-=particleloop.fade;/ 周期衰减(2) 当粒子生命期衰减为0时,更新粒子,代码如下:if (particleloop.life0.0f)particleloop.life=2.0f;particleloop.fade=float(rand()%100)/1500.0f+0.002f;particleloop.x=0.0f;particleloop.y=0.0f;particleloop.z=0.0f;particleloop.xi=float(rand()%60)-30.0f);particleloop.yi=float(rand()%60)-30.0f);particleloop.zi=float(rand()%60)-30.0f);particleloop.r=colorscol0; /渲染particleloop.g=colorscol1; /渲染particleloop.b=colorscol2; /渲染particleloop.xg=xg1;particleloop.yg=yg1; particleloop.zg=0.0f;5、实现交互的原理5.1 键盘和鼠标主菜单控制火焰颜色(1)定义颜色数组及设置火焰颜色:static GLfloat colors83=/ 颜色数组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,;particleloop.r=colorscol0; /渲染particleloop.g=colorscol1; /渲染particleloop.b=colorscol2; /渲染(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: 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; glutPostRedisplay(); break; default: break; void MainMenuHandler(int option) /定义主菜单功能 switch(option) case 0: exit(0); LoadGLTextures(); break;case 1: col=1; break; case 2: col=2; break; default: break; glutPostRedisplay(); void MenuHandler() / 主菜单 int mainMenu; mainMenu = glutCreateMenu(MainMenuHandler); glutSetMenu(mainMenu); glutAddMenuEntry(Exit, 0); glutAddMenuEntry(bright blue, 1); glutAddMenuEntry(croci, 2); glutAttachMenu(GLUT_RIGHT_BUTTON); 5.2 键盘控制火焰燃烧方向(代码可参照键盘控制火焰颜色)5.3 选择贴图纹理用键盘输入选择纹理所对应的编号,代码可参照附录源代码中int LoadGLTextures()函数。6、 程序运行结果 图6.1 图6.2例如:选择2号:五角星火焰(图6.1) 贴图纹理:五角星(图6.2) 图6.3.1 图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”,结果如图6.5.1 与图6.5.2 图6.6.1 图6.6.2通过改变粒子X与Y轴的初速度和加速度,来改变火焰的燃烧方向,如图6.6.1与图6.6.27、总结在完成基于粒子系统的火焰模拟实验的过程中,我们小组各成员通过分工与合作多种形式,查阅和检索相关文献及资料,最终通过学习基本原理、讨论实验方案、研究重点难点及验证预期结果等过程完成了本次实验。我们实验的特色在于使用键盘和鼠标控制火焰颜色的交互变化,以及使用键盘控制火焰加速度的变化。在本次实验中我们学习并掌握了相关知识,同时也深刻的体会到了合作的重要性。今后,我们一定会更加认真学习。8、参考资料: 计算机图形学基础(第2版) 陆枫 何云峰 编著 太原工业学院精品课程9、附录:源程序代码清单#include stdafx.h#include #include #include #include #include #include #include math.h#defineMAX_PARTICLES5000/ 粒子数的数目floatslowdown=3.0f;floatxspeed;/ X轴速度floatyspeed;/ Y轴速度floatzoom=-40.0f;int a;float xg1;float yg1=0.2f;GLuintloop;/ 循环变量GLuintcol=5; / 初始颜色GLuinttexture1;/ 创建数组存储纹理typedef struct/ 创建结构体boolactive;/ floatlife;/ 粒子生命周期floatfade;/ 消失的速度floatr;floatg;floatb;floatx;/ 坐标floaty;/ 坐标floatz;/ 坐标floatxi; floatyi; floatzi; floatxg;/ X轴加速度floatyg;/ Y轴加速度floatzg;/ Z轴加速度particles;particles particleMAX_PARTICLES;/ 创建粒子数组static GLfloat colors83=/ 颜色数组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,; AUX_RGBImageRec *LoadBMP(char *Filename)/ 载入位图图像 FILE *File=NULL; if (!Filename) return NULL; File=fopen(Filename,r); if (File) fclose(File);return auxDIBImageLoad(Filename); return NULL;int LoadGLTextures()/ 载入位图(调用上面的代码)并转换成纹理 int Status=FALSE; AUX_RGBImageRec *TextureImage1; memset(TextureImage,0,sizeof(void *)*1); printf(q键 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(nn); printf(*Choose the number of the shape*n); /选择纹理printf(-1. Circlet2. Pentagramt3.Triangle-nn);printf(-4. Flamet5. four-pointed Start6.Hexagon-nn);scanf(%d,&a); if(a6)printf(*Tip:Error!Please re-enter after exit!*nn);exit(0);switch(a)case 1: if (TextureImage0=LoadBMP(Circle.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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break; case 2: if (TextureImage0=LoadBMP(Pentagram.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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break;case 3: if (TextureImage0=LoadBMP(Triangle.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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break; case 4: if (TextureImage0=LoadBMP(Flame.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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break; case 5: if (TextureImage0=LoadBMP(four-pointed Star.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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break; case 6: if (TextureImage0=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, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); break; if (TextureImage0)if (TextureImage0-data)free(TextureImage0-data);free(TextureImage0); return Status;void ReSizeGLScene(GLsizei width, GLsizei height)/ 调整并初始化GL窗口glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();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_BLEND);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,texture0); for (loop=0;loopMAX_PARTICLES;loop+)particleloop.active=true;particleloop.life=2.0f;particleloop.fade=float(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.0f;particleloop.yg=0.3f;particleloop.zg=0.0f;void DrawGLScene(GLvoid)/ 绘制glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,5, 0,1.5,0, 0,1,0);for (loop=0;loopMAX_PARTICLES;loop+)if (particleloop.active)float x=particleloop.x;float y=particleloop.y;float z=particleloop.z+zoom; glColor4f(particleloop.r,particleloop.g,particleloop.b,particleloop.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);glEnd();particleloop.x+=particleloop.xi/(slowdown*1050); /X的坐标随X轴速度变化 particleloop.y+=particleloop.yi/(slowdown*1050);particleloop.z+=particleloop.zi/(slowdown*1050); particleloop.xi+=particleloop.xg;/ X轴的速度随X轴的加速度变化particleloop.yi+=particleloop.yg;particleloop.zi+=particleloop.zg;particleloop.life-=particleloop.fade;/ 周期衰减if (particleloop.life0.0f)particleloop.life=2.0f;particleloop.fade=float(rand()%100)/1500.0f+0.002f;particleloop.x=0.0f;particleloop.y=0.0f;particleloop.z=0.0f;particleloop.xi=float(rand()%60)-30.0f);particleloop.yi=float(rand()%60)-30.0f);particleloop.zi=float(rand()%60)-30.0f);particleloop.r=colorscol0; /渲染particleloop.g=colorscol1; /渲染particleloop.b=colorscol2; /渲染particleloop.xg=xg1;particleloop.y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国网安徽省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题有完整答案详解
- 2026国家管网集团北方管道公司秋季高校毕业生招聘笔试参考题库(浓缩500题)附参考答案详解(精练)
- 2026国网辽宁省电力校园招聘(提前批)笔试模拟试题浓缩500题附答案详解(夺分金卷)
- 2026国家管网集团高校毕业生招聘笔试参考题库(浓缩500题)及答案详解【典优】
- 2026国网贵州省电力公司高校毕业生提前批招聘笔试模拟试题浓缩500题含答案详解(a卷)
- 2026秋季国家管网集团工程技术创新公司(国家管网集团造价管理中心)高校毕业生招聘考试参考试题(浓缩500题)及参考答案详解1套
- 国家管网集团山东分公司2026届秋季高校毕业生招聘考试备考试题(浓缩500题)及参考答案详解(巩固)
- 2026国家管网集团北方管道公司秋季高校毕业生招聘考试备考试题(浓缩500题)及答案详解(全优)
- 2025国网湖南省电力校园招聘(提前批)笔试模拟试题浓缩500题及答案详解(典优)
- 国家管网集团高校毕业生招聘考试题库(浓缩500题)附参考答案详解(基础题)
- 科室消防培训课件
- 英语A级常用词汇
- 汉语拼音《ieueer》教学课件
- 机电控制及可编程序控制器技术课程设计1
- HY/T 0326-2022无居民海岛使用价格评估规程
- GB/T 474-2008煤样的制备方法
- 塔吊附着整改措施
- 中式面点师(初级)考试题库及答案
- 流域产汇流计算第四章
- 2023年四川省自然资源投资集团有限责任公司招聘笔试题库及答案解析
- DB43-T 1954-2020生姜姜瘟病综合防控技术规程
评论
0/150
提交评论