多媒體技術(shù)實驗報告_第1頁
多媒體技術(shù)實驗報告_第2頁
多媒體技術(shù)實驗報告_第3頁
多媒體技術(shù)實驗報告_第4頁
多媒體技術(shù)實驗報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1q實驗 粒子系統(tǒng)講授時數(shù):0.5學(xué)時。一、 實驗類型研究創(chuàng)新型實驗 二、 實驗?zāi)康?通過本實驗讓學(xué)生熟練掌握三維圖形程序編寫,掌握粒子系統(tǒng)的設(shè)計與實現(xiàn),加深對粒子系統(tǒng)的認識。 本實驗要實現(xiàn)一個基于粒子系統(tǒng)的煙花效果模擬。粒子系統(tǒng)包括:粒子初始化、粒子狀態(tài)控制、粒子的繪制。 實現(xiàn)本系統(tǒng)實現(xiàn)之后,學(xué)生可以在此基礎(chǔ)上進行擴展,例如模擬噴泉效果。噴泉效果的實現(xiàn)包括:粒子顏色保持藍色,粒子運動受到重力作用。三、 實驗要求 三維圖形繪制工程配置和環(huán)境設(shè)置。 粒子系統(tǒng)設(shè)計,實現(xiàn)粒子系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和管理的設(shè)計模式。 各個粒子位置、顏色計算。 粒子的繪制。 提交程序使用手冊(可簡單到為一個readme文件)。

2、四、 實驗內(nèi)容利用opengl實現(xiàn)一個粒子系統(tǒng),模擬煙花效果。五、 開設(shè)方式小組實驗。六、 學(xué)時數(shù)8學(xué)時。七、 參考資料1 vc+編程指南,2 nehe opengl框架程序3 opengl sdk下載/八、 實驗后記電 子 科 技 大 學(xué)實 驗 報 告學(xué)生姓名: 學(xué) 號: 指導(dǎo)教師:實驗地點: 實驗時間:一、實驗室名稱:計算機學(xué)院軟件實驗室二、實驗項目名稱:粒子系統(tǒng)三、實驗學(xué)時:8學(xué)時四、實驗原理粒子系統(tǒng)在計算機動畫中被廣泛用于模擬爆炸、噴泉、流星等效果。在本實驗中,粒子系統(tǒng)被用來模擬不斷噴射的煙花。實現(xiàn)粒子系統(tǒng)包括:(1)粒子初始化。(2)粒子運動和

3、顏色模擬。(3)粒子生命周期模擬。粒子的初始化給所有的粒子的位置、速度、生命和衰減周期賦值;運動和顏色模擬是計算粒子的速度、位置在每一時間步長之后變化的值;粒子的生命周期模擬是在粒子生命完結(jié)之后重新初始化該粒子。為了實現(xiàn)這樣的效果,粒子應(yīng)該具有以下屬性:(1)boolactive;粒子的活動狀態(tài),為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分量。在具體的模擬過程中,需要創(chuàng)建一個數(shù)組叫particle數(shù)組存max_particles個元素。也就是說我們創(chuàng)建1000(max_particles)個粒子,存儲空間為每個粒子提供相應(yīng)的信息。使用光滑的陰影,清除背景為黑色,關(guān)閉深度測試,綁定并映射紋理。啟用映射位圖后我們選擇粒

5、子紋理。唯一的改變就是禁用深度測試和初始化粒子。并且創(chuàng)建一個循環(huán)loop.這個環(huán)將會更新每一個粒子。每次循環(huán)時首先檢查粒子是否活躍。如果不活躍,則不被更新。在這個程序中,它們始終活躍。五、實驗?zāi)康谋緦嶒炓獙崿F(xiàn)粒子系統(tǒng)。粒子系統(tǒng)包括以下模塊:粒子初始化;位置、速度、顏色實時計算;生命周期控制?;鞠到y(tǒng)實現(xiàn)之后,可以在此基礎(chǔ)上擴展為噴泉效果。實現(xiàn)噴泉效果需要一下幾個模塊:(1)粒子水平方向的隨機初速度。(2)粒子運動模擬。(3)位置低于地面,重新初始化。六、實驗內(nèi)容利用opengl實現(xiàn)一個粒子系統(tǒng)。七、實驗器材(設(shè)備、元器件)1. 操作系統(tǒng):windows xp2. 開發(fā)工具:vc2005,ope

6、ngl庫3. 普通pc即可八、實驗步驟(1) 創(chuàng)建工程啟動vc+2005,選擇菜單中的“文件”-“新建”-“項目”。在彈出的對話框中,左邊的“項目類型”框中,選擇“visual c+”,在右邊框中,選擇“win32項目”。在對話框下邊,選擇工程文件存放目錄及輸入名稱,如particle,單擊“確定”。在“win32應(yīng)用程序向?qū)А敝袉螕簟跋乱徊健?,在“?yīng)用程序類型”中選擇“windows應(yīng)用程序”;在“附加選項”中選擇“空項目”。點擊“完成”。(2) 設(shè)置此工程所需的opengl庫選擇菜單中的“項目”-“屬性”。在彈出的“particle屬性頁”對話框中,展開“鏈接器”選擇“輸入”。選擇右邊框中

7、的“附加依賴項”,單擊最右端的“”小按鈕,彈出“附加依賴項”對話框,輸入“opengl32.lib glut.lib glaux.lib glu32.lib”(注意,輸入雙引號中的內(nèi)容,各個庫用空格分開;否則會出現(xiàn)鏈接錯誤。如果編譯時提示找不到以上的lib文件,把“鏈接器-常規(guī)-附加庫目錄”選擇為opengl sdk所在目錄,或者從opengl sdk中把這幾個lib文件放到microsoft visual studio 8vclib)。“配置屬性-常規(guī)-字符集”設(shè)置為“未設(shè)置”。“c/c+-預(yù)編譯頭-創(chuàng)建/使用預(yù)編譯頭”設(shè)置為“不使用預(yù)編譯頭”。單擊“確定”結(jié)束。項目屬性設(shè)置完成。(3) 在

8、工程項目中添加源文件在“解決方案資源管理器”中,選中particle項目下的“源文件”篩選器。右鍵點擊后選擇“添加”,然后選擇新建項。在“添加新項”的窗口中選擇“c+文件(.cpp)”模板,并命名為main.cpp。(4) 錄入源程序程序使用到了資源文件“particle.bmp”作為粒子的貼圖,該文件如下:圖1 particle.bmp將該文件保存在工程目錄“particledata”目錄下。將源程序?qū)懭氲焦こ讨?。新建好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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論