【课程设计】基于openGL的粒子系统-模拟火焰_第1页
【课程设计】基于openGL的粒子系统-模拟火焰_第2页
【课程设计】基于openGL的粒子系统-模拟火焰_第3页
【课程设计】基于openGL的粒子系统-模拟火焰_第4页
【课程设计】基于openGL的粒子系统-模拟火焰_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

【课程设计】基于openGL的粒子系统——模拟火焰【课程设计】基于openGL的粒子系统——模拟火焰课程设计报告题目基于openGL的粒子系统——模拟火焰系(部)专业班级学生姓名学号起止时间:指导教师(签字)系主任(签字)提交时间:一、设计任务及要求:设计任务:要求:此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。指导教师签名:年月日二、指导教师评语:【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第1页。年月日三、成绩计算机图形学课程设计报告1.课程设计目的本学期系统学习了《计算机图形学》这门专业课,在学期期末按课程要求进行实验。粒子系统由Reeves于1983年首次提出,此后越来越受到重视,它的主要优点是可以利用非常简单的体素来构造复杂的物体,为自然现象(如火焰、雨、雪、树林等)的造型提供了强有力的技术手段。该课程设计以培养我们算法设计与实现的能力为目标,通过实践,使我们了解、掌握计算机图形学的基本知识和关键技术、了解和熟悉计算机图形学的方法、工具和环境,同时培养我们的思维能力和团队合作能力。2.课程设计描述及要求粒子系统的基本思想是用许多形状简单且赋予生命的微小粒子作为基本元素来表示基本物体,侧重于物体的总体形态和特征的动态变化。把物体定义为许多不规则、随机分布的粒子,且每个粒子均有一定的生命周期。随着时间的推移,旧的粒子不断消失(死亡),新的粒子不断加入(生长)。粒子的这种出生、成长、衰老、死亡的过程,能够较好的反应模糊物体的动态特征。一个粒子系统是不断进化的,在生命周期的每一刻,都要完成以下四步:初始化粒子更新粒子删除死粒子绘制粒子第一步产生5000个新粒子,他们的每个粒子都有生命周期为2;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第2页。第三步检查粒子的生命期,若为零,则将粒子从系统中删除;第四步显示粒子系统中的粒子。要求:此次课程设计的课题为通过编程,实现火焰的绘制。实现交互控制火焰颜色、火焰燃烧方向、贴图形状,通过实验得到火焰贴图大小与火焰效果的关系,并给出代码和结果截图。3(系统开发环境开发工具:VC6.0操作系统:MicrosoftWindows74、粒子系统(火焰)的算法原理4.1定义粒子的属性宏定义粒子的最大数目5000,并定义结构体来设置粒子属性,代码如下:#defineMAX_PARTICLES5000//粒子数的数目typedefstruct//创建结构体{boolactive;//floatlife;//粒子生命周期floatfade;//消失的速度floatr;floatg;floatb;floatx;//坐标floaty;//坐标floatz;//坐标【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第3页。f【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第3页。floatyi;floatzi;floatxg;//X轴加速度floatyg;//Y轴加速度floatzg;//Z轴加速度}particles;particlesparticle[MAX_PARTICLES];//创建粒子数组4.2初始化粒子利用循环变量loop,loop小于等于最大粒子数目时,则初始化每一个粒子,代码如下:for(loop=0;loop<MAX_PARTICLES;loop++){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];particle[loop].xg=0.0f;particle[loop].yg=0.3f;particle[loop].zg=0.0f;}【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第4页。(1)定义消失变量,使粒子的生命期递减一个随机的生命步,代码如下:particle[loop].fade=float(rand()%100)/1500.0f+0.002f;(2)粒子的颜色透明度随着生命期的减少而降低,最终消失,代码如下:glColor4f(particle[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+=particle[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=float(rand()%100)/1500.0f+0.002f;particle[loop].x=0.0f;particle[loop].y=0.0f;particle[loop].z=0.0f;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第5页。particle[loop].yi=float((rand()%60)-30.0f);particle[loop].zi=float((rand()%60)-30.0f);particle[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)定义颜色数组及设置火焰颜色:staticGLfloatcolors[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].b=colors[col][2];//渲染(2)用键盘的“q”“w”“a”“s”“z”键和主菜单选择数组中相应行的RGB值来改变火焰颜【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第6页。voidkeyboard(unsignedcharkey,intx,inty)//定义键盘功能{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;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第7页。{col=6;yg1-=0.05;glutPostRedisplay();}break;case'z':{col=7;glutPostRedisplay();}break;default:break;}}voidMainMenuHandler(intoption)//定义主菜单功能{switch(option){case0:{exit(0);LoadGLTextures();【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第8页。case1:{col=1;}break;case2:{col=2;}break;default:break;}glutPostRedisplay();}voidMenuHandler()//主菜单{intmainMenu;mainMenu=glutCreateMenu(MainMenuHandler);glutSetMenu(mainMenu);glutAddMenuEntry("Exit",0);glutAddMenuEntry("brightblue",1);glutAddMenuEntry("croci",2);glutAttachMenu(GLUT_RIGHT_BUTTON);}【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第9页。(代码可参照键盘控制火焰颜色)5.3选择贴图纹理用键盘输入选择纹理所对应的编号,代码可参照附录源代码中intLoadGLTextures()函数。6、程序运行结果图6.1图6.2【课程设计】基于openGL的粒子系统【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第10页。图6.3.1图6.3.2【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第11页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第12页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第12页。【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第13页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第14页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第14页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第15页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第15页。图6.6.1图6.6.2通过改变粒子X与Y轴的初速度和加速度,来改变火焰的燃烧方向,如图6.6.1与图6.6.27、总结在完成基于粒子系统的火焰模拟实验的过程中,我们小组各成员通过分工与合作多种形式,查阅和检索相关文献及资料,最终通过学习基本原理、讨论实验方案、研究重点难点及验证预期结果等过程完成了本次实验。我们实验的特色在于使用键盘和鼠标控制火焰颜色的交互变化,以及使用键盘控制火焰加速度的变化。在本次实验中我们学习并掌握了相关知识,同时也深刻的体会到了合作的重要性。今后,我们一定会更加认真学习。8、参考资料:《计算机图形学基础(第2版)》陆枫何云峰编著太原工业学院精品课程9、附录:源程序代码清单【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第16页。#include<windows.h>#include<stdio.h>#include<GL/gl.h>#include<GL/glu.h>#include<Gl/glut.h>#include<GL/glaux.h>#include"math.h"#defineMAX_PARTICLES5000//粒子数的数目floatslowdown=3.0f;floatxspeed;//X轴速度floatyspeed;//Y轴速度floatzoom=-40.0f;inta;floatxg1;floatyg1=0.2f;GLuintloop;//循环变量GLuintcol=5;//初始颜色GLuinttexture[1];//创建数组存储纹理typedefstruct//创建结构体{boolactive;//floatlife;//粒子生命周期floatfade;//消失的速度floatr;floatg;floatb;floatx;//坐标floaty;//坐标floatz;//坐标floatxi;floatyi;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第17页。floatxg;//X轴加速度floatyg;//Y轴加速度floatzg;//Z轴加速度}particles;particlesparticle[MAX_PARTICLES];//创建粒子数组staticGLfloatcolors[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},};AUX_RGBImageRec*LoadBMP(char*Filename)//载入位图图像{FILE*File=NULL;if(!Filename){returnNULL;}File=fopen(Filename,"r");if(File){fclose(File);【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第18页。}returnNULL;}intLoadGLTextures()//载入位图(调用上面的代码)并转换成纹理{intStatus=FALSE;AUX_RGBImageRec*TextureImage[1];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("\n\n");printf("***Choosethenumberoftheshape***\n");//选择纹理printf("---1.Circle\t2.Pentagram\t3.Triangle---\n\n");printf("---4.Flame\t5.four-pointedStar\t6.Hexagon---\n\n");scanf("%d",&a);if(a>6){printf("****Tip:Error!!!Pleasere-enterafterexit!!****\n\n");exit(0);}【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第19页。{case1:{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_LINEAR);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);}}break;case2:{if(TextureImage[0]=LoadBMP("Pentagram.bmp")){Status=TRUE;glGenTextures(1,&texture[0]);glBindTexture(GL_TEXTURE_2D,texture[0]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第20页。glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);}}break;case3:{if(TextureImage[0]=LoadBMP("Triangle.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);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);}}break;case4:{if(TextureImage[0]=LoadBMP("Flame.bmp")){【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第21页。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);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);}}break;case5:{if(TextureImage[0]=LoadBMP("four-pointedStar.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);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);}}break;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第22页。{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_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(TextureImage[0]->data){free(TextureImage[0]->data);}free(TextureImage[0]);}【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第23页。voidReSizeGLScene(GLsizeiwidth,GLsizeiheight)//调整并初始化GL窗口{glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,200.0f);}voidInitGL(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,texture[0]);for(loop=0;loop<MAX_PARTICLES;loop++){particle[loop].active=true;particle[loop].life=2.0f;【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第24页。【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第24页。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];particle[loop].xg=0.0f;particle[loop].yg=0.3f;particle[loop].zg=0.0f;}}voidDrawGLScene(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;loop<MAX_PARTICLES;loop++){if(particle[loop].active){floatx=particle[loop].x;floaty=particle[loop].y;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第25页。glColor4f(particle[loop].r,particle[loop].g,particle[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);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[loop].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=0.0f;【课程设计】基于openGL的粒子系统——【课程设计】基于openGL的粒子系统——模拟火焰全文共31页,当前为第26页。particle[loop].z=0.0f;30.0f);particle[loop].xi=float((rand()%60)-particle[loop].yi=float((rand()%60)-30.0f);particle[loop].zi=float((rand()%60)-30.0f);particle[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;}}}glutSwapBuffers();}voidMainMenuHandler(intoption)/

温馨提示

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

评论

0/150

提交评论