計算機圖形學課程設計完本_第1頁
計算機圖形學課程設計完本_第2頁
計算機圖形學課程設計完本_第3頁
計算機圖形學課程設計完本_第4頁
計算機圖形學課程設計完本_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、中文摘要本次課程設計采用OpenGL來完成。OpenGL是個定義了一個跨編程語言、跨平臺的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenGL是個專業(yè)的圖形程序接口,是一個功能強大,調用方便的底層圖形庫。本次課程設計是在win7系統(tǒng)下VC+6.0中的win32環(huán)境中,通過使用OpenGL所提供的標準庫函數(shù),綜合圖形學里的坐標轉換,投影變換,光照以及紋理等知識,實現(xiàn)一個簡單的太陽系的運行狀況。該系統(tǒng)僅做演示使用,將只包括太陽,地球與月亮,并且不保證相關數(shù)據(jù)的設定準確性。目錄一、課程設計任務及要求1二、需求分析1三、系統(tǒng)設計1四、詳細設計24.1 初始化的設定24.2 光源的位置與觀察位置的

2、設定34.3 紋理映射的設置34.4 各星球球體的繪制54.5 星球公轉軌道74.6 人機交互式的實現(xiàn)8五、運行調試與分析討論95.1 程序運行截圖95.2 結果分析10六、設計體會與小結11七、參考文獻12一、課程設計任務及要求1. 利用OpenGL創(chuàng)建太陽,地球,月亮三個球體。2. 實現(xiàn)“月亮繞著地球轉,地球繞著太陽轉”。3. 為太陽,地球,月亮附上不同的紋理。4. 具有較好的動畫效果,消除閃爍現(xiàn)象。5. 其他功能的添加。二、需求分析本次課程設計使用的編譯軟件為Visual C+ 6.0。設計中通過調用OpenGL函數(shù)庫以來完成太陽,月亮,地球的球體繪制與紋理的加載,通過矩陣的變換以實現(xiàn)星

3、球的運動效果。從而模擬出太陽系的運行效果動畫。在之后,加入星球的軌道軌跡,使得模擬系統(tǒng)3D效果更加明顯。并加入人機交互操作。通過“q,w,e,s,a,d”鍵來調整觀察視角,可以實現(xiàn)全方位對此系統(tǒng)進行觀察,使系統(tǒng)具有一定的可操作性。三、系統(tǒng)設計本次課題為:實現(xiàn)太陽系運行動畫。系統(tǒng)設計步驟為:1.太陽,地球,月亮三個球體的創(chuàng)建。2.利用坐標矩陣變換表示出三個球體之間的關系,即:地球繞著太陽轉,月亮繞著地球轉。3.增加光源,材質,選擇好視角與窗口裁剪尺寸。4.設計太陽,地球,月亮的紋理映射。5.增加太陽,地球,月亮的自傳。6.增加地球與月亮的旋轉軌道。7.人機交互式操作的設定。系統(tǒng)程序流圖如下:圖3

4、-1系統(tǒng)流程圖四、詳細設計4.1 初始化的設定思路:將需要使用的OpenGL庫中的函數(shù)進行初始化,例如:光源,材質,繪圖函數(shù)等。詳細代碼如下:void Initial() GLfloat light_diffuse=1.0f,1.0f,1.0f,1.0f; /材質設置 GLfloat 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); / 啟

5、用深度測試 glFrontFace(GL_CCW); / 指定逆時針繞法表示多邊形正面 g_text = gluNewQuadric();/創(chuàng)建2次幾何體gluQuadricTexture(g_text,GL_TRUE);/可以加載貼圖glEnable(GL_TEXTURE_2D); /開啟紋理 4.2 光源的位置與觀察位置的設定思路:利用OpenGL庫函數(shù) glLightfv()對光源的位置進行設定,用函數(shù)gluLookAt()對視角觀察位置進行設置。詳細代碼為下:/設置光源的位置GLfloat position = 1.0f, 1.0f, 1.5f, 0.0f ;glLightfv (GL

6、_LIGHT1, GL_POSITION, position);gluLookAt(c,a,b,0,0,-30,0,1,0); /觀察角度其中光源設置為方向光源,函數(shù)gluLookAt()中的函數(shù)包括三對坐標(從左到右),可理解為:第一對參數(shù)為人體腦袋所在位置(x,y,z),第二對參數(shù)為眼睛所看的位置(x,y,z),第三對參數(shù)表示為腦袋所朝向的位置,為向量坐標。其中的“c,a,b”可通過鍵盤的設定改變值,從而使得觀察視角可以進行移動,此功能在下面有介紹。4.3 紋理映射的設置思路:利用函數(shù)LoadBMP()確認是否存在圖片所在的文件夾,再利用函數(shù)LoadGTextures()將圖片加載成紋理,

7、存儲在數(shù)組texture中。函數(shù)代碼為:AUX_RGBImageRec *LoadBMP(char *Filename)FILE *File=NULL;if (!Filename) / 確保文件名已提供。return NULL; / 如果沒提供,返回 NULLFile=fopen(Filename,r);if (File) / 文件存在么?fclose(File); / 關閉句柄return auxDIBImageLoad(Filename); /載入位圖并返回指針return NULL;int LoadGLTextures(char *Filename) /a=255;int Status=

8、FALSE; AUX_RGBImageRec *TextureImage3;memset(TextureImage,0,sizeof(void *)*1); if (TextureImage0=LoadBMP(Filename)Status=TRUE;glGenTextures(1, &texture0);glBindTexture(GL_TEXTURE_2D, texture0);glTexImage2D(GL_TEXTURE_2D, 0, 3,TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Tex

9、tureImage0-data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); / 線形濾波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); if (TextureImage0) / 紋理是否存在/a=255;if (TextureImage0-data) / 紋理圖像是否存在free(TextureImage0-data); / 釋放紋理圖像占用的內存free(TextureImage0); / 釋放圖像結構return Status

10、;在繪制星球前,直接調用函數(shù)LoadTextures(“圖片所在位置”),加載的圖片將成為紋理,存儲在texture0中,啟用紋理后,繪制出來的圖形將被附上當前紋理。4.4 各星球球體的繪制設定自轉軸:即在繪圖區(qū)進行移動前設定圖形繞軸旋轉,便可形成星球的自轉。設定公轉軸:移動繪圖區(qū),通過移動的距離與設定圖形繞軸旋轉,即形成星球公轉。導入紋理:通過LoadGLTextures()函數(shù)加載圖片,編程紋理存儲在texture0,再通過函數(shù)glBindTexture(GL_TEXTURE_2D, texture0)將當前紋理設置成texture0所存儲的紋理,即可加載所需的圖片。繪制球體:加載函數(shù)gl

11、uSphere()設定半徑大小與圖像細膩度繪制出要求的圖形。詳細代碼入下: /繪制太陽 glRotatef(fElect3, 0.0f, 1.0f, 0.0f); /太陽的自轉設置glEnable(GL_LIGHTING); 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

12、(GL_LIGHTING); glPushMatrix();/繪制地球 glEnable(GL_LIGHT1);glRotatef(fElect1-fElect3, 0.0f, 1.0f, 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_t

13、ext,9, 64, 64);glBindTexture(GL_TEXTURE_2D, 0); /繪制月亮 glColor3f(1.0f, 1.0f, 1.0f);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,

14、 64); fElect2 += 30.0f; if(fElect2 360.0f) fElect2 = 10.0f; glBindTexture(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(); /取消閃爍最后一個函數(shù)glutSwapBuffers()的引用是為了取消圖像的閃爍現(xiàn)象。通過增加星球的旋轉步

15、長以實現(xiàn)星球運動的動畫,旋轉步長的設置影響了星球的旋轉速度。在實現(xiàn)不同星球的公轉時候,需要注意上個星球的繪制是否對這次繪制有影響,在本次設計中,由于設置了星球的自轉,因此在進行星球公轉設置的時候應該對圍繞的星球的自轉形成的影響進行抵消。4.5 星球公轉軌道思路:星球公轉軌道的繪制利用直線的繪制來完成,將軌道分成36段直線,即360度,每段為10度,因為已經設定了星球公轉的半徑,因此36段直線的頂點很好確定。詳細代碼:/地球軌道glBegin(GL_LINE_STRIP); for(intangle=0;angle=360;angle+) glVertex3f(50*sin(3.*angle/1

16、80),0,50*cos(3.*angle/180);glEnd();/月亮軌道的繪制glBegin(GL_LINE_STRIP); for(angle=0;angle=360;angle+) glVertex3f(-10*sin(3.*angle/180),0,-10*cos(3.*angle/180);glEnd();在本次設計中將軌道設置成圓弧形,并且的取值為近似值3.,因此在軌道的計算時將會出現(xiàn)必然的誤差,但在視覺上不會出現(xiàn)太大的問題。4.6 人機交互式的實現(xiàn)本次設計中加上了鍵盤按鍵qweasd的操作功能,對視角進行改變,即改變上面介紹過的函數(shù)gluLookAt()中的參數(shù),使得視角變

17、成動態(tài)。詳細代碼設置:void keyboard(unsigned char key,int x,int y) /鍵盤設置函數(shù)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;通過不停進行按鍵,改變視角坐標值。按緊某一個鍵可形成一定漫游的效果。此函數(shù)需要在main()中通過glutKeyboardFunc(keyboard)進行調用。五、運行調試與分析討論

18、5.1 程序運行截圖 圖5-1太陽顯示效果圖 圖5-2地球顯示效果與公轉軌道圖 圖5-3月亮顯示效果與公轉軌道 圖5-4 程序運行界面圖 圖5-5 交互操作俯視圖 圖5-6 交互操作側視圖5.2 結果分析程序經過測試,運行流暢,基本滿足了課程設計任務的要求,實現(xiàn)了太陽系的模擬。太陽,地球,月亮紋理加載成功。太陽,地球,月球的自轉實現(xiàn)成功,地球與月球的公轉與公轉軌道成功在屏幕顯示。通過鍵盤鍵位qweasd能成功對視角進行轉換。但是由于對于OpenGL的不熟悉,對于太陽,地球,月球的材質設置未作要求,采用統(tǒng)一的材質,并且對于光源設置以及其他的一些函數(shù)功能不夠熟悉,使得最終的顯示圖像并不完美。此次設

19、計只加入了鍵盤的鍵位操作,為加入鼠標的功能,并且通過鍵盤實現(xiàn)的功能,即:視角的轉換,并不完善,出現(xiàn)了一些問題。在有條件的狀況下,應該更加深刻的對此次OpenGL中的使用的一些函數(shù)進行理解與轉化,從而能有清晰的思路變化其中的函數(shù)參數(shù),使得界面呈現(xiàn)的更加美觀,并能加入更多的人機交互操作功能,而不僅僅限于幾個鍵位的操作,這樣能增加程序的趣味性。六、設計體會與小結在本次課程設計中,由于初學OpenGL,對于其中的一些函數(shù)的引用不熟練,導致嚴重延誤了代碼的進程,使得無法實現(xiàn)更多的功能。例如本次設計中的紋理映射,利用gluSolidSphere()函數(shù)繪制實心圓是無法加載紋理的,而我使用的繪制球體的函數(shù)正是這個函數(shù),查閱了大量書上與網上的資料,問題仍然

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論