




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上中文摘要本次課程設計采用OpenGL來完成。OpenGL是個定義了一個跨編程語言、跨平臺的編程接口的規格,它用于三維圖象(二維的亦可)。OpenGL是個專業的圖形程序接口,是一個功能強大,調用方便的底層圖形庫。本次課程設計是在win7系統下VC+6.0中的win32環境中,通過使用OpenGL所提供的標準庫函數,綜合圖形學里的坐標轉換,投影變換,光照以及紋理等知識,實現一個簡單的太陽系的運行狀況。該系統僅做演示使用,將只包括太陽,地球與月亮,并且不保證相關數據的設定準確性。目錄專心-專注-專業一、課程設計任務及要求1. 利用OpenGL創建太陽,地球,月亮三個球體。2
2、. 實現“月亮繞著地球轉,地球繞著太陽轉”。3. 為太陽,地球,月亮附上不同的紋理。4. 具有較好的動畫效果,消除閃爍現象。5. 其他功能的添加。二、需求分析本次課程設計使用的編譯軟件為Visual C+ 6.0。設計中通過調用OpenGL函數庫以來完成太陽,月亮,地球的球體繪制與紋理的加載,通過矩陣的變換以實現星球的運動效果。從而模擬出太陽系的運行效果動畫。在之后,加入星球的軌道軌跡,使得模擬系統3D效果更加明顯。并加入人機交互操作。通過“q,w,e,s,a,d”鍵來調整觀察視角,可以實現全方位對此系統進行觀察,使系統具有一定的可操作性。三、系統設計本次課題為:實現太陽系運行動畫。系統設計步
3、驟為:1.太陽,地球,月亮三個球體的創建。2.利用坐標矩陣變換表示出三個球體之間的關系,即:地球繞著太陽轉,月亮繞著地球轉。3.增加光源,材質,選擇好視角與窗口裁剪尺寸。4.設計太陽,地球,月亮的紋理映射。5.增加太陽,地球,月亮的自傳。6.增加地球與月亮的旋轉軌道。7.人機交互式操作的設定。系統程序流圖如下:圖3-1系統流程圖四、詳細設計4.1 初始化的設定思路:將需要使用的OpenGL庫中的函數進行初始化,例如:光源,材質,繪圖函數等。詳細代碼如下:void Initial() GLfloat light_diffuse=1.0f,1.0f,1.0f,1.0f; /材質設置 GLfloat
4、 light_ambient=0.0f,0.5f,0.5f,1.0f; glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT1,GL_AMBIENT,light_ambient); glEnable(GL_DEPTH_TEST); / 啟用深度測試 glFrontFace(GL_CCW); / 指定逆時針繞法表示多邊形正面 g_text = gluNewQuadric();/創建2次幾何體gluQuadricTexture(g_text,GL_TRUE);/可以加載貼圖glEnable(GL_TEXTURE_2D);
5、 /開啟紋理 4.2 光源的位置與觀察位置的設定思路:利用OpenGL庫函數 glLightfv()對光源的位置進行設定,用函數gluLookAt()對視角觀察位置進行設置。詳細代碼為下:/設置光源的位置GLfloat position = 1.0f, 1.0f, 1.5f, 0.0f ;glLightfv (GL_LIGHT1, GL_POSITION, position);gluLookAt(c,a,b,0,0,-30,0,1,0); /觀察角度其中光源設置為方向光源,函數gluLookAt()中的函數包括三對坐標(從左到右),可理解為:第一對參數為人體腦袋所在位置(x,y,z),第二對參
6、數為眼睛所看的位置(x,y,z),第三對參數表示為腦袋所朝向的位置,為向量坐標。其中的“c,a,b”可通過鍵盤的設定改變值,從而使得觀察視角可以進行移動,此功能在下面有介紹。4.3 紋理映射的設置思路:利用函數LoadBMP()確認是否存在圖片所在的文件夾,再利用函數LoadGTextures()將圖片加載成紋理,存儲在數組texture中。函數代碼為:AUX_RGBImageRec *LoadBMP(char *Filename)FILE *File=NULL;if (!Filename) / 確保文件名已提供。return NULL; / 如果沒提供,返回 NULLFile=fopen(F
7、ilename,"r");if (File) / 文件存在么?fclose(File); / 關閉句柄return auxDIBImageLoad(Filename); /載入位圖并返回指針return NULL;int LoadGLTextures(char *Filename) /a=255;int Status=FALSE; AUX_RGBImageRec *TextureImage3;memset(TextureImage,0,sizeof(void *)*1); if (TextureImage0=LoadBMP(Filename)Status=TRUE;glGe
8、nTextures(1, &texture0);glBindTexture(GL_TEXTURE_2D, texture0);glTexImage2D(GL_TEXTURE_2D, 0, 3,TextureImage0->sizeX, TextureImage0->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); / 線形濾波glTexParameteri(GL_TEXTURE_
9、2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage0) / 紋理是否存在/a=255;if (TextureImage0->data) / 紋理圖像是否存在free(TextureImage0->data); / 釋放紋理圖像占用的內存free(TextureImage0); / 釋放圖像結構return Status;在繪制星球前,直接調用函數LoadTextures(“圖片所在位置”),加載的圖片將成為紋理,存儲在texture0中,啟用紋理后,繪制出來的圖形將被附上當前紋理。4.4 各星球球體的繪制設定自轉軸:即在繪圖區
10、進行移動前設定圖形繞軸旋轉,便可形成星球的自轉。設定公轉軸:移動繪圖區,通過移動的距離與設定圖形繞軸旋轉,即形成星球公轉。導入紋理:通過LoadGLTextures()函數加載圖片,編程紋理存儲在texture0,再通過函數glBindTexture(GL_TEXTURE_2D, texture0)將當前紋理設置成texture0所存儲的紋理,即可加載所需的圖片。繪制球體:加載函數gluSphere()設定半徑大小與圖像細膩度繪制出要求的圖形。詳細代碼入下: /繪制太陽 glRotatef(fElect3, 0.0f, 1.0f, 0.0f); /太陽的自轉設置glEnable(GL_LIGH
11、TING); glEnable(GL_LIGHT0);LoadGLTextures("tex/1.bmp");glBindTexture(GL_TEXTURE_2D, texture0); glColor3f (255, 0.0f, 0.0f); gluSphere(g_text,18, 128, 128);glBindTexture(GL_TEXTURE_2D, 0);glDisable(GL_LIGHTING); glPushMatrix();/繪制地球 glEnable(GL_LIGHT1);glRotatef(fElect1-fElect3, 0.0f, 1.0f,
12、 0.0f); /地球的公轉設置glColor3f(1.0f, 1.0f, 1.0f);LoadGLTextures("tex/2.bmp");glBindTexture(GL_TEXTURE_2D, texture0);glTranslatef(50.0f, 0.0f, 0.0f);/平移一段距離 glRotatef(fElect3, 0.0f, 1.0f, 0.0f);/地球自轉設置gluSphere(g_text,9, 64, 64);glBindTexture(GL_TEXTURE_2D, 0); /繪制月亮 glColor3f(1.0f, 1.0f, 1.0f);
13、LoadGLTextures("tex/3.bmp"); glBindTexture(GL_TEXTURE_2D, texture0); glRotatef(fElect2-fElect3, 0.0f, 1.0f, 0.0f); /月亮公轉 glTranslatef(-10.0f, 0.0f, 0.0f);glRotatef(fElect3, 1.0f, 1.0f, 0.0f); /月球自轉gluSphere(g_text,2, 64, 64); fElect2 += 30.0f; if(fElect2 > 360.0f) fElect2 = 10.0f; glBin
14、dTexture(GL_TEXTURE_2D, 0) ; glPopMatrix(); / 增加旋轉步長形成動畫 fElect1 += 5.0f; if(fElect1 > 360.0f) fElect1 = 10.0f; fElect3 +=13.0f;if(fElect3 > 360.0f) fElect3 = 10.0f; glutSwapBuffers(); /取消閃爍最后一個函數glutSwapBuffers()的引用是為了取消圖像的閃爍現象。通過增加星球的旋轉步長以實現星球運動的動畫,旋轉步長的設置影響了星球的旋轉速度。在實現不同星球的公轉時候,需要注意上個星球的繪制是
15、否對這次繪制有影響,在本次設計中,由于設置了星球的自轉,因此在進行星球公轉設置的時候應該對圍繞的星球的自轉形成的影響進行抵消。4.5 星球公轉軌道思路:星球公轉軌道的繪制利用直線的繪制來完成,將軌道分成36段直線,即360度,每段為10度,因為已經設定了星球公轉的半徑,因此36段直線的頂點很好確定。詳細代碼:/地球軌道glBegin(GL_LINE_STRIP); for(intangle=0;angle<=360;angle+) glVertex3f(50*sin(3.*angle/180),0,50*cos(3.*angle/180);glEnd();/月亮軌道的繪制glBegin(
16、GL_LINE_STRIP); for(angle=0;angle<=360;angle+) glVertex3f(-10*sin(3.*angle/180),0,-10*cos(3.*angle/180);glEnd();在本次設計中將軌道設置成圓弧形,并且的取值為近似值3.,因此在軌道的計算時將會出現必然的誤差,但在視覺上不會出現太大的問題。4.6 人機交互式的實現本次設計中加上了鍵盤按鍵qweasd的操作功能,對視角進行改變,即改變上面介紹過的函數gluLookAt()中的參數,使得視角變成動態。詳細代碼設置:void keyboard(unsigned char key,int
17、x,int y) /鍵盤設置函數switch(key)case 'w':a+=20;break;/y軸坐標變化case 's':a-=20;break;case 'a':b-=10;break;/z軸坐標變化case 'd':b+=10;break;case 'q':c+=20;break;/x軸坐標變化case 'e':c-=20;break;通過不停進行按鍵,改變視角坐標值。按緊某一個鍵可形成一定漫游的效果。此函數需要在main()中通過glutKeyboardFunc(keyboard)進行調
18、用。五、運行調試與分析討論5.1 程序運行截圖 圖5-1太陽顯示效果圖 圖5-2地球顯示效果與公轉軌道圖 圖5-3月亮顯示效果與公轉軌道 圖5-4 程序運行界面圖 圖5-5 交互操作俯視圖 圖5-6 交互操作側視圖5.2 結果分析程序經過測試,運行流暢,基本滿足了課程設計任務的要求,實現了太陽系的模擬。太陽,地球,月亮紋理加載成功。太陽,地球,月球的自轉實現成功,地球與月球的公轉與公轉軌道成功在屏幕顯示。通過鍵盤鍵位qweasd能成功對視角進行轉換。但是由于對于OpenGL的不熟悉,對于太陽,地球,月球的材質設置未作要求,采用統一的材質,并且對于光源設置以及其他的一些函數功能不夠熟悉,使得最終
19、的顯示圖像并不完美。此次設計只加入了鍵盤的鍵位操作,為加入鼠標的功能,并且通過鍵盤實現的功能,即:視角的轉換,并不完善,出現了一些問題。在有條件的狀況下,應該更加深刻的對此次OpenGL中的使用的一些函數進行理解與轉化,從而能有清晰的思路變化其中的函數參數,使得界面呈現的更加美觀,并能加入更多的人機交互操作功能,而不僅僅限于幾個鍵位的操作,這樣能增加程序的趣味性。六、設計體會與小結在本次課程設計中,由于初學OpenGL,對于其中的一些函數的引用不熟練,導致嚴重延誤了代碼的進程,使得無法實現更多的功能。例如本次設計中的紋理映射,利用gluSolidSphere()函數繪制實心圓是無法加載紋理的,而我使用的繪制球體的函數正是這個函數,查閱了大量書上與網上的資料,問題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外包服務業務合作協議樣板
- 教育科技產品分類表
- 小學議論文:閱讀的重要性7篇范文
- 教育培訓需求調研報告表格版
- eBay跨境電商交易數據表
- 信息技術支持農業現代化的服務合同
- 工業自動化控制理論知識清單
- 強化企業責任落實與合規意識的培育
- 愛的傳遞我的志愿者經歷讀后感13篇
- 業務渠道分銷協議條款大綱
- 農機耕地合同協議書范本
- 2025年四年級下冊美術期末測試題附答案
- 催化劑對異氰酸酯反應活性的影響
- 國家開放大學《水力學(B)》形考任務1-10參考答案
- 國家開放大學《C語言程序設計》綜合測試題參考答案
- 老年人生活自理能力評估表
- 火電機組能耗指標分析指導性意見
- 我國各類型扣件技術說明
- 現澆混凝土構件含模量參考表(浙江03、10定額砼含模量對照表)
- DB45∕T 2418-2021 水運工程交工檢測與竣工檢測規范
- 旋流風口、球型噴口選型參數表
評論
0/150
提交評論