【課程設計】基于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頁?!菊n程設計】基于openGL的粒子系統——模擬火焰全文共31頁,當前為第12頁。【課程設計】基于openGL的粒子系統——【課程設計】基于openGL的粒子系統——模擬火焰全文共31頁,當前為第13頁?!菊n程設計】基于openGL的粒子系統——模擬火焰全文共31頁,當前為第14頁。【課程設計】基于openGL的粒子系統——模擬火焰全文共31頁,當前為第14頁?!菊n程設計】基于openGL的粒子系統——模擬火焰全文共31頁,當前為第15頁?!菊n程設計】基于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

提交評論