版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1q实验 粒子系统讲授时数:0.5学时。一、 实验类型研究创新型实验 二、 实验目的 通过本实验让学生熟练掌握三维图形程序编写,掌握粒子系统的设计与实现,加深对粒子系统的认识。 本实验要实现一个基于粒子系统的烟花效果模拟。粒子系统包括:粒子初始化、粒子状态控制、粒子的绘制。 实现本系统实现之后,学生可以在此基础上进行扩展,例如模拟喷泉效果。喷泉效果的实现包括:粒子颜色保持蓝色,粒子运动受到重力作用。三、 实验要求 三维图形绘制工程配置和环境设置。 粒子系统设计,实现粒子系统的数据结构和管理的设计模式。 各个粒子位置、颜色计算。 粒子的绘制。 提交程序使用手册(可简单到为一个readme文件)。
2、四、 实验内容利用opengl实现一个粒子系统,模拟烟花效果。五、 开设方式小组实验。六、 学时数8学时。七、 参考资料1 vc+编程指南,2 nehe opengl框架程序3 opengl sdk下载/八、 实验后记电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:一、实验室名称:计算机学院软件实验室二、实验项目名称:粒子系统三、实验学时:8学时四、实验原理粒子系统在计算机动画中被广泛用于模拟爆炸、喷泉、流星等效果。在本实验中,粒子系统被用来模拟不断喷射的烟花。实现粒子系统包括:(1)粒子初始化。(2)粒子运动和
3、颜色模拟。(3)粒子生命周期模拟。粒子的初始化给所有的粒子的位置、速度、生命和衰减周期赋值;运动和颜色模拟是计算粒子的速度、位置在每一时间步长之后变化的值;粒子的生命周期模拟是在粒子生命完结之后重新初始化该粒子。为了实现这样的效果,粒子应该具有以下属性:(1)boolactive;粒子的活动状态,为true时,才模拟粒子。(2)floatlife;粒子的生命值,在模拟过程中不断减少,如果为0就重新初始化粒子。(3)floatfade;粒子的生命值减少的速度。(4)floatr;粒子颜色r分量。(5)floatg;粒子颜色g分量。(6)floatb;粒子颜色b分量。(7)floatx;粒子位置x
4、分量。(8)floaty;粒子位置y分量。(9)floatz;粒子位置z分量。(10)floatxi;粒子速度x分量。(11)floatyi;粒子速度y分量。(12)floatzi;粒子速度z分量。(13)floatxg;粒子加速度x分量。(14)floatyg;粒子加速度x分量。(15)floatzg;粒子加速度x分量。在具体的模拟过程中,需要创建一个数组叫particle数组存max_particles个元素。也就是说我们创建1000(max_particles)个粒子,存储空间为每个粒子提供相应的信息。使用光滑的阴影,清除背景为黑色,关闭深度测试,绑定并映射纹理。启用映射位图后我们选择粒
5、子纹理。唯一的改变就是禁用深度测试和初始化粒子。并且创建一个循环loop.这个环将会更新每一个粒子。每次循环时首先检查粒子是否活跃。如果不活跃,则不被更新。在这个程序中,它们始终活跃。五、实验目的本实验要实现粒子系统。粒子系统包括以下模块:粒子初始化;位置、速度、颜色实时计算;生命周期控制。基本系统实现之后,可以在此基础上扩展为喷泉效果。实现喷泉效果需要一下几个模块:(1)粒子水平方向的随机初速度。(2)粒子运动模拟。(3)位置低于地面,重新初始化。六、实验内容利用opengl实现一个粒子系统。七、实验器材(设备、元器件)1. 操作系统:windows xp2. 开发工具:vc2005,ope
6、ngl库3. 普通pc即可八、实验步骤(1) 创建工程启动vc+2005,选择菜单中的“文件”-“新建”-“项目”。在弹出的对话框中,左边的“项目类型”框中,选择“visual c+”,在右边框中,选择“win32项目”。在对话框下边,选择工程文件存放目录及输入名称,如particle,单击“确定”。在“win32应用程序向导”中单击“下一步”,在“应用程序类型”中选择“windows应用程序”;在“附加选项”中选择“空项目”。点击“完成”。(2) 设置此工程所需的opengl库选择菜单中的“项目”-“属性”。在弹出的“particle属性页”对话框中,展开“链接器”选择“输入”。选择右边框中
7、的“附加依赖项”,单击最右端的“”小按钮,弹出“附加依赖项”对话框,输入“opengl32.lib glut.lib glaux.lib glu32.lib”(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误。如果编译时提示找不到以上的lib文件,把“链接器-常规-附加库目录”选择为opengl sdk所在目录,或者从opengl sdk中把这几个lib文件放到microsoft visual studio 8vclib)。“配置属性-常规-字符集”设置为“未设置”。“c/c+-预编译头-创建/使用预编译头”设置为“不使用预编译头”。单击“确定”结束。项目属性设置完成。(3) 在
8、工程项目中添加源文件在“解决方案资源管理器”中,选中particle项目下的“源文件”筛选器。右键点击后选择“添加”,然后选择新建项。在“添加新项”的窗口中选择“c+文件(.cpp)”模板,并命名为main.cpp。(4) 录入源程序程序使用到了资源文件“particle.bmp”作为粒子的贴图,该文件如下:图1 particle.bmp将该文件保存在工程目录“particledata”目录下。将源程序写入到工程中。新建好main.cpp文件后,将代码写入该文件。参考源代码如下:main.cpp#include / header file for windows#include / heade
9、r file for standard input/output#include / header file for the opengl32 library#include / header file for the glu32 library#include / header file for the glaux library#definemax_particles1000/ number of particles to createhdchdc=null;/ private gdi device contexthglrchrc=null;/ permanent rendering co
10、ntexthwndhwnd=null;/ holds our window handlehinstancehinstance;/ holds the instance of the applicationboolkeys256;/ array used for the keyboard routineboolactive=true;/ window active flag set to true by defaultboolfullscreen=true;/ fullscreen flag set to fullscreen mode by defaultboolrainbow=true;/
11、rainbow mode?boolsp;/ spacebar pressed?boolrp;/ enter key pressed?floatslowdown=2.0f;/ slow down particlesfloatxspeed;/ base x speed (to allow keyboard direction of tail)floatyspeed;/ base y speed (to allow keyboard direction of tail)floatzoom=-40.0f;/ used to zoom outgluintloop;/ misc loop variable
12、gluintcol;/ current color selectiongluintdelay;/ rainbow effect delaygluinttexture1;/ storage for our particle texturetypedef struct/ create a structure for particleboolactive;/ active (yes/no)floatlife;/ particle lifefloatfade;/ fade speedfloatr;/ red valuefloatg;/ green valuefloatb;/ blue valueflo
13、atx;/ x positionfloaty;/ y positionfloatz;/ z positionfloatxi;/ x directionfloatyi;/ y directionfloatzi;/ z directionfloatxg;/ x gravityfloatyg;/ y gravityfloatzg;/ z gravityparticles;/ particles structureparticles particlemax_particles;/ particle array (room for particle info)static glfloat colors1
14、23=/ rainbow of colors1.0f,0.5f,0.5f,1.0f,0.75f,0.5f,1.0f,1.0f,0.5f,0.75f,1.0f,0.5f,0.5f,1.0f,0.5f,0.5f,1.0f,0.75f,0.5f,1.0f,1.0f,0.5f,0.75f,1.0f,0.5f,0.5f,1.0f,0.75f,0.5f,1.0f,1.0f,0.5f,1.0f,1.0f,0.5f,0.75f;lresultcallback wndproc(hwnd, uint, wparam, lparam);/ declaration for wndprocaux_rgbimagerec
15、 *loadbmp(char *filename)/ loads a bitmap image file *file=null;/ file handle if (!filename)/ make sure a filename was given return null;/ if not return null file=fopen(filename,r);/ check to see if the file exists if (file)/ does the file exist? fclose(file);/ close the handlereturn auxdibimageload
16、(filename);/ load the bitmap and return a pointer return null;/ if load failed return nullint loadgltextures()/ load bitmap and convert to a texture int status=false;/ status indicator aux_rgbimagerec *textureimage1;/ create storage space for the textures memset(textureimage,0,sizeof(void *)*1);/ se
17、t the pointer to null if (textureimage0=loadbmp(data/particle.bmp)/ load particle texture status=true;/ set the status to trueglgentextures(1, &texture0);/ create one textureglbindtexture(gl_texture_2d, texture0);gltexparameteri(gl_texture_2d,gl_texture_mag_filter,gl_linear);gltexparameteri(gl_textu
18、re_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); if (textureimage0)/ if texture existsif (textureimage0-data)/ if texture image existsfree(textureimage0-data);/ free the texture image
19、memoryfree(textureimage0);/ free the image structure return status;/ return the statusglvoid resizeglscene(glsizei width, glsizei height)/ resize and initialize the gl windowif (height=0)/ prevent a divide by zero byheight=1;/ making height equal oneglviewport(0,0,width,height);/ reset the current v
20、iewportglmatrixmode(gl_projection);/ select the projection matrixglloadidentity();/ reset the projection matrix/ calculate the aspect ratio of the windowgluperspective(45.0f,(glfloat)width/(glfloat)height,0.1f,200.0f);glmatrixmode(gl_modelview);/ select the modelview matrixglloadidentity();/ reset t
21、he modelview matrixint initgl(glvoid)/ all setup for opengl goes hereif (!loadgltextures()/ jump to texture loading routinereturn false;/ if texture didnt load return falseglshademodel(gl_smooth);/ enable smooth shadingglclearcolor(0.0f,0.0f,0.0f,0.0f);/ black backgroundglcleardepth(1.0f);/ depth bu
22、ffer setupgldisable(gl_depth_test);/ disable depth testingglenable(gl_blend);/ enable blendingglblendfunc(gl_src_alpha,gl_one);/ type of blending to performglhint(gl_perspective_correction_hint,gl_nicest);/ really nice perspective calculationsglhint(gl_point_smooth_hint,gl_nicest);/ really nice poin
23、t smoothingglenable(gl_texture_2d);/ enable texture mappingglbindtexture(gl_texture_2d,texture0);/ select our texturefor (loop=0;loopmax_particles;loop+)/ initials all the texturesparticleloop.active=true;/ make all the particles activeparticleloop.life=1.0f;/ give all the particles full lifeparticl
24、eloop.fade=float(rand()%100)/1000.0f+0.003f;/ random fade speedparticleloop.r=colorsloop*(12/max_particles)0;/ select red rainbow colorparticleloop.g=colorsloop*(12/max_particles)1;/ select red rainbow colorparticleloop.b=colorsloop*(12/max_particles)2;/ select red rainbow colorparticleloop.xi=float
25、(rand()%50)-26.0f)*10.0f;/ random speed on x axisparticleloop.yi=float(rand()%50)-25.0f)*10.0f;/ random speed on y axisparticleloop.zi=float(rand()%50)-25.0f)*10.0f;/ random speed on z axisparticleloop.xg=0.0f;/ set horizontal pull to zeroparticleloop.yg=-0.8f;/ set vertical pull downwardparticleloo
26、p.zg=0.0f;/ set pull on z axis to zeroreturn true;/ initialization went okint drawglscene(glvoid)/ heres where we do all the drawingglclear(gl_color_buffer_bit | gl_depth_buffer_bit);/ clear screen and depth bufferglloadidentity();/ reset the modelview matrixfor (loop=0;loopmax_particles;loop+)/ loo
27、p through all the particlesif (particleloop.active)/ if the particle is activefloat x=particleloop.x;/ grab our particle x positionfloat y=particleloop.y;/ grab our particle y positionfloat z=particleloop.z+zoom;/ particle z pos + zoom/ draw the particle using our rgb values, fade the particle based
28、 on its lifeglcolor4f(particleloop.r,particleloop.g,particleloop.b,particleloop.life);glbegin(gl_triangle_strip);/ build quad from a triangle strip gltexcoord2d(1,1); glvertex3f(x+0.5f,y+0.5f,z); / top rightgltexcoord2d(0,1); glvertex3f(x-0.5f,y+0.5f,z); / top leftgltexcoord2d(1,0); glvertex3f(x+0.5
29、f,y-0.5f,z); / bottom rightgltexcoord2d(0,0); glvertex3f(x-0.5f,y-0.5f,z); / bottom leftglend();/ done building triangle stripparticleloop.x+=particleloop.xi/(slowdown*1000);/ move on the x axis by x speedparticleloop.y+=particleloop.yi/(slowdown*1000);/ move on the y axis by y speedparticleloop.z+=
30、particleloop.zi/(slowdown*1000);/ move on the z axis by z speedparticleloop.xi+=particleloop.xg;/ take pull on x axis into accountparticleloop.yi+=particleloop.yg;/ take pull on y axis into accountparticleloop.zi+=particleloop.zg;/ take pull on z axis into accountparticleloop.life-=particleloop.fade
31、;/ reduce particles life by fadeif (particleloop.life0.0f)/ if particle is burned outparticleloop.life=1.0f;/ give it new lifeparticleloop.fade=float(rand()%100)/1000.0f+0.003f;/ random fade valueparticleloop.x=0.0f;/ center on x axisparticleloop.y=0.0f;/ center on y axisparticleloop.z=0.0f;/ center
32、 on z axisparticleloop.xi=xspeed+float(rand()%60)-32.0f);/ x axis speed and directionparticleloop.yi=yspeed+float(rand()%60)-30.0f);/ y axis speed and directionparticleloop.zi=float(rand()%60)-30.0f);/ z axis speed and directionparticleloop.r=colorscol0;/ select red from color tableparticleloop.g=co
33、lorscol1;/ select green from color tableparticleloop.b=colorscol2;/ select blue from color table/ if number pad 8 and y gravity is less than 1.5 increase pull upwardsif (keysvk_numpad8 & (particleloop.yg-1.5f) particleloop.yg-=0.01f;/ if number pad 6 and x gravity is less than 1.5 increase pull righ
34、tif (keysvk_numpad6 & (particleloop.xg-1.5f) particleloop.xg-=0.01f;if (keysvk_tab)/ tab key causes a burstparticleloop.x=0.0f;/ center on x axisparticleloop.y=0.0f;/ center on y axisparticleloop.z=0.0f;/ center on z axisparticleloop.xi=float(rand()%50)-26.0f)*10.0f;/ random speed on x axisparticlel
35、oop.yi=float(rand()%50)-25.0f)*10.0f;/ random speed on y axisparticleloop.zi=float(rand()%50)-25.0f)*10.0f;/ random speed on z axis return true;/ everything went okglvoid killglwindow(glvoid)/ properly kill the windowif (fullscreen)/ are we in fullscreen mode?changedisplaysettings(null,0);/ if so sw
36、itch back to the desktopshowcursor(true);/ show mouse pointerif (hrc)/ do we have a rendering context?if (!wglmakecurrent(null,null)/ are we able to release the dc and rc contexts?messagebox(null,release of dc and rc failed.,shutdown error,mb_ok | mb_iconinformation);if (!wgldeletecontext(hrc)/ are
37、we able to delete the rc?messagebox(null,release rendering context failed.,shutdown error,mb_ok | mb_iconinformation);hrc=null;/ set rc to nullif (hdc & !releasedc(hwnd,hdc)/ are we able to release the dcmessagebox(null,release device context failed.,shutdown error,mb_ok | mb_iconinformation);hdc=nu
38、ll;/ set dc to nullif (hwnd & !destroywindow(hwnd)/ are we able to destroy the window?messagebox(null,could not release hwnd.,shutdown error,mb_ok | mb_iconinformation);hwnd=null;/ set hwnd to nullif (!unregisterclass(opengl,hinstance)/ are we able to unregister classmessagebox(null,could not unregi
39、ster class.,shutdown error,mb_ok | mb_iconinformation);hinstance=null;/ set hinstance to null/*this code creates our opengl window. parameters are:* *title- title to appear at the top of the window* *width- width of the gl window or fullscreen mode* *height- height of the gl window or fullscreen mod
40、e* *bits- number of bits to use for color (8/16/24/32)* *fullscreenflag- use fullscreen mode (true) or windowed mode (false)*/ bool createglwindow(char* title, int width, int height, int bits, bool fullscreenflag)gluintpixelformat;/ holds the results after searching for a matchwndclasswc;/ windows c
41、lass structuredworddwexstyle;/ window extended styledworddwstyle;/ window stylerectwindowrect;/ grabs rectangle upper left / lower right valueswindowrect.left=(long)0;/ set left value to 0windowrect.right=(long)width;/ set right value to requested widthwindowrect.top=(long)0;/ set top value to 0wind
42、owrect.bottom=(long)height;/ set bottom value to requested heightfullscreen=fullscreenflag;/ set the global fullscreen flaghinstance= getmodulehandle(null);/ grab an instance for our windowwc.style= cs_hredraw | cs_vredraw | cs_owndc;/ redraw on size, and own dc for window.wc.lpfnwndproc= (wndproc)
43、wndproc;/ wndproc handles messageswc.cbclsextra= 0;/ no extra window datawc.cbwndextra= 0;/ no extra window datawc.hinstance= hinstance;/ set the instancewc.hicon= loadicon(null, idi_winlogo);/ load the default iconwc.hcursor= loadcursor(null, idc_arrow);/ load the arrow pointerwc.hbrbackground= nul
44、l;/ no background required for glwc.lpszmenuname= null;/ we dont want a menuwc.lpszclassname= opengl;/ set the class nameif (!registerclass(&wc)/ attempt to register the window classmessagebox(null,failed to register the window class.,error,mb_ok|mb_iconexclamation);return false;/ return falseif (fu
45、llscreen)/ attempt fullscreen mode?devmode dmscreensettings;/ device modememset(&dmscreensettings,0,sizeof(dmscreensettings);/ makes sure memorys cleareddmscreensettings.dmsize=sizeof(dmscreensettings);/ size of the devmode structuredmscreensettings.dmpelswidth= width;/ selected screen widthdmscreen
46、settings.dmpelsheight= height;/ selected screen heightdmscreensettings.dmbitsperpel= bits;/ selected bits per pixeldmscreensettings.dmfields=dm_bitsperpel|dm_pelswidth|dm_pelsheight;/ try to set selected mode and get results. note: cds_fullscreen gets rid of start bar.if (changedisplaysettings(&dmsc
47、reensettings,cds_fullscreen)!=disp_change_successful)/ if the mode fails, offer two options. quit or use windowed mode.if (messagebox(null,the requested fullscreen mode is not supported bynyour video card. use windowed mode instead?,nehe gl,mb_yesno|mb_iconexclamation)=idyes)fullscreen=false;/ windowed mode selected. fullscreen = falseelse/ pop up a message box letting user know the program is closing.messa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度数据中心电力系统运维服务合同4篇
- 二零二五年度打印机设备租赁与全球服务网络合作合同4篇
- 2025年度展览馆场地租赁及展览策划执行合同8篇
- 二零二五版码头转租与船舶租赁一体化合同4篇
- 2025年大型商场租赁合同(含品牌推广服务)4篇
- 二零二五版二手房交易税费承担及产权过户协议3篇
- 二零二五板材加工技术改造升级合同3篇
- 2025年度家居窗帘布艺设计销售合同范本4篇
- 2025年度城市更新拆迁居间服务协议合同4篇
- 2025年度汽车租赁保证金合同范本8篇
- 第22单元(二次函数)-单元测试卷(2)-2024-2025学年数学人教版九年级上册(含答案解析)
- 蓝色3D风工作总结汇报模板
- 安全常识课件
- 河北省石家庄市2023-2024学年高一上学期期末联考化学试题(含答案)
- 2024年江苏省导游服务技能大赛理论考试题库(含答案)
- 2024年中考英语阅读理解表格型解题技巧讲解(含练习题及答案)
- 新版中国食物成分表
- 浙江省温州市温州中学2025届数学高二上期末综合测试试题含解析
- 2024年山东省青岛市中考生物试题(含答案)
- 保安公司市场拓展方案-保安拓展工作方案
- GB/T 15843.2-2024网络安全技术实体鉴别第2部分:采用鉴别式加密的机制
评论
0/150
提交评论