




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上中文摘要本次課程設(shè)計(jì)采用OpenGL來完成。OpenGL是個(gè)定義了一個(gè)跨編程語言、跨平臺(tái)的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenGL是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫(kù)。本次課程設(shè)計(jì)是在win7系統(tǒng)下VC+6.0中的win32環(huán)境中,通過使用OpenGL所提供的標(biāo)準(zhǔn)庫(kù)函數(shù),綜合圖形學(xué)里的坐標(biāo)轉(zhuǎn)換,投影變換,光照以及紋理等知識(shí),實(shí)現(xiàn)一個(gè)簡(jiǎn)單的太陽(yáng)系的運(yùn)行狀況。該系統(tǒng)僅做演示使用,將只包括太陽(yáng),地球與月亮,并且不保證相關(guān)數(shù)據(jù)的設(shè)定準(zhǔn)確性。目錄專心-專注-專業(yè)一、課程設(shè)計(jì)任務(wù)及要求1. 利用OpenGL創(chuàng)建太陽(yáng),地球,月亮三個(gè)球體。2
2、. 實(shí)現(xiàn)“月亮繞著地球轉(zhuǎn),地球繞著太陽(yáng)轉(zhuǎn)”。3. 為太陽(yáng),地球,月亮附上不同的紋理。4. 具有較好的動(dòng)畫效果,消除閃爍現(xiàn)象。5. 其他功能的添加。二、需求分析本次課程設(shè)計(jì)使用的編譯軟件為Visual C+ 6.0。設(shè)計(jì)中通過調(diào)用OpenGL函數(shù)庫(kù)以來完成太陽(yáng),月亮,地球的球體繪制與紋理的加載,通過矩陣的變換以實(shí)現(xiàn)星球的運(yùn)動(dòng)效果。從而模擬出太陽(yáng)系的運(yùn)行效果動(dòng)畫。在之后,加入星球的軌道軌跡,使得模擬系統(tǒng)3D效果更加明顯。并加入人機(jī)交互操作。通過“q,w,e,s,a,d”鍵來調(diào)整觀察視角,可以實(shí)現(xiàn)全方位對(duì)此系統(tǒng)進(jìn)行觀察,使系統(tǒng)具有一定的可操作性。三、系統(tǒng)設(shè)計(jì)本次課題為:實(shí)現(xiàn)太陽(yáng)系運(yùn)行動(dòng)畫。系統(tǒng)設(shè)計(jì)步
3、驟為:1.太陽(yáng),地球,月亮三個(gè)球體的創(chuàng)建。2.利用坐標(biāo)矩陣變換表示出三個(gè)球體之間的關(guān)系,即:地球繞著太陽(yáng)轉(zhuǎn),月亮繞著地球轉(zhuǎn)。3.增加光源,材質(zhì),選擇好視角與窗口裁剪尺寸。4.設(shè)計(jì)太陽(yáng),地球,月亮的紋理映射。5.增加太陽(yáng),地球,月亮的自傳。6.增加地球與月亮的旋轉(zhuǎn)軌道。7.人機(jī)交互式操作的設(shè)定。系統(tǒng)程序流圖如下:圖3-1系統(tǒng)流程圖四、詳細(xì)設(shè)計(jì)4.1 初始化的設(shè)定思路:將需要使用的OpenGL庫(kù)中的函數(shù)進(jìn)行初始化,例如:光源,材質(zhì),繪圖函數(shù)等。詳細(xì)代碼如下:void Initial() GLfloat light_diffuse=1.0f,1.0f,1.0f,1.0f; /材質(zhì)設(shè)置 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); / 啟用深度測(cè)試 glFrontFace(GL_CCW); / 指定逆時(shí)針繞法表示多邊形正面 g_text = gluNewQuadric();/創(chuàng)建2次幾何體gluQuadricTexture(g_text,GL_TRUE);/可以加載貼圖glEnable(GL_TEXTURE_2D);
5、 /開啟紋理 4.2 光源的位置與觀察位置的設(shè)定思路:利用OpenGL庫(kù)函數(shù) glLightfv()對(duì)光源的位置進(jìn)行設(shè)定,用函數(shù)gluLookAt()對(duì)視角觀察位置進(jìn)行設(shè)置。詳細(xì)代碼為下:/設(shè)置光源的位置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); /觀察角度其中光源設(shè)置為方向光源,函數(shù)gluLookAt()中的函數(shù)包括三對(duì)坐標(biāo)(從左到右),可理解為:第一對(duì)參數(shù)為人體腦袋所在位置(x,y,z),第二對(duì)參
6、數(shù)為眼睛所看的位置(x,y,z),第三對(duì)參數(shù)表示為腦袋所朝向的位置,為向量坐標(biāo)。其中的“c,a,b”可通過鍵盤的設(shè)定改變值,從而使得觀察視角可以進(jìn)行移動(dòng),此功能在下面有介紹。4.3 紋理映射的設(shè)置思路:利用函數(shù)LoadBMP()確認(rèn)是否存在圖片所在的文件夾,再利用函數(shù)LoadGTextures()將圖片加載成紋理,存儲(chǔ)在數(shù)組texture中。函數(shù)代碼為:AUX_RGBImageRec *LoadBMP(char *Filename)FILE *File=NULL;if (!Filename) / 確保文件名已提供。return NULL; / 如果沒提供,返回 NULLFile=fopen(F
7、ilename,"r");if (File) / 文件存在么?fclose(File); / 關(guān)閉句柄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); / 釋放紋理圖像占用的內(nèi)存free(TextureImage0); / 釋放圖像結(jié)構(gòu)return Status;在繪制星球前,直接調(diào)用函數(shù)LoadTextures(“圖片所在位置”),加載的圖片將成為紋理,存儲(chǔ)在texture0中,啟用紋理后,繪制出來的圖形將被附上當(dāng)前紋理。4.4 各星球球體的繪制設(shè)定自轉(zhuǎn)軸:即在繪圖區(qū)
10、進(jìn)行移動(dòng)前設(shè)定圖形繞軸旋轉(zhuǎn),便可形成星球的自轉(zhuǎn)。設(shè)定公轉(zhuǎn)軸:移動(dòng)繪圖區(qū),通過移動(dòng)的距離與設(shè)定圖形繞軸旋轉(zhuǎn),即形成星球公轉(zhuǎn)。導(dǎo)入紋理:通過LoadGLTextures()函數(shù)加載圖片,編程紋理存儲(chǔ)在texture0,再通過函數(shù)glBindTexture(GL_TEXTURE_2D, texture0)將當(dāng)前紋理設(shè)置成texture0所存儲(chǔ)的紋理,即可加載所需的圖片。繪制球體:加載函數(shù)gluSphere()設(shè)定半徑大小與圖像細(xì)膩度繪制出要求的圖形。詳細(xì)代碼入下: /繪制太陽(yáng) glRotatef(fElect3, 0.0f, 1.0f, 0.0f); /太陽(yáng)的自轉(zhuǎn)設(shè)置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); /地球的公轉(zhuǎn)設(shè)置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);/地球自轉(zhuǎn)設(shè)置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); /月亮公轉(zhuǎn) glTranslatef(-10.0f, 0.0f, 0.0f);glRotatef(fElect3, 1.0f, 1.0f, 0.0f); /月球自轉(zhuǎn)gluSphere(g_text,2, 64, 64); fElect2 += 30.0f; if(fElect2 > 360.0f) fElect2 = 10.0f; glBin
14、dTexture(GL_TEXTURE_2D, 0) ; glPopMatrix(); / 增加旋轉(zhuǎn)步長(zhǎng)形成動(dòng)畫 fElect1 += 5.0f; if(fElect1 > 360.0f) fElect1 = 10.0f; fElect3 +=13.0f;if(fElect3 > 360.0f) fElect3 = 10.0f; glutSwapBuffers(); /取消閃爍最后一個(gè)函數(shù)glutSwapBuffers()的引用是為了取消圖像的閃爍現(xiàn)象。通過增加星球的旋轉(zhuǎn)步長(zhǎng)以實(shí)現(xiàn)星球運(yùn)動(dòng)的動(dòng)畫,旋轉(zhuǎn)步長(zhǎng)的設(shè)置影響了星球的旋轉(zhuǎn)速度。在實(shí)現(xiàn)不同星球的公轉(zhuǎn)時(shí)候,需要注意上個(gè)星球的繪制是
15、否對(duì)這次繪制有影響,在本次設(shè)計(jì)中,由于設(shè)置了星球的自轉(zhuǎn),因此在進(jìn)行星球公轉(zhuǎn)設(shè)置的時(shí)候應(yīng)該對(duì)圍繞的星球的自轉(zhuǎn)形成的影響進(jìn)行抵消。4.5 星球公轉(zhuǎn)軌道思路:星球公轉(zhuǎn)軌道的繪制利用直線的繪制來完成,將軌道分成36段直線,即360度,每段為10度,因?yàn)橐呀?jīng)設(shè)定了星球公轉(zhuǎn)的半徑,因此36段直線的頂點(diǎn)很好確定。詳細(xì)代碼:/地球軌道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();在本次設(shè)計(jì)中將軌道設(shè)置成圓弧形,并且的取值為近似值3.,因此在軌道的計(jì)算時(shí)將會(huì)出現(xiàn)必然的誤差,但在視覺上不會(huì)出現(xiàn)太大的問題。4.6 人機(jī)交互式的實(shí)現(xiàn)本次設(shè)計(jì)中加上了鍵盤按鍵qweasd的操作功能,對(duì)視角進(jìn)行改變,即改變上面介紹過的函數(shù)gluLookAt()中的參數(shù),使得視角變成動(dòng)態(tài)。詳細(xì)代碼設(shè)置:void keyboard(unsigned char key,int
17、x,int y) /鍵盤設(shè)置函數(shù)switch(key)case 'w':a+=20;break;/y軸坐標(biāo)變化case 's':a-=20;break;case 'a':b-=10;break;/z軸坐標(biāo)變化case 'd':b+=10;break;case 'q':c+=20;break;/x軸坐標(biāo)變化case 'e':c-=20;break;通過不停進(jìn)行按鍵,改變視角坐標(biāo)值。按緊某一個(gè)鍵可形成一定漫游的效果。此函數(shù)需要在main()中通過glutKeyboardFunc(keyboard)進(jìn)行調(diào)
18、用。五、運(yùn)行調(diào)試與分析討論5.1 程序運(yùn)行截圖 圖5-1太陽(yáng)顯示效果圖 圖5-2地球顯示效果與公轉(zhuǎn)軌道圖 圖5-3月亮顯示效果與公轉(zhuǎn)軌道 圖5-4 程序運(yùn)行界面圖 圖5-5 交互操作俯視圖 圖5-6 交互操作側(cè)視圖5.2 結(jié)果分析程序經(jīng)過測(cè)試,運(yùn)行流暢,基本滿足了課程設(shè)計(jì)任務(wù)的要求,實(shí)現(xiàn)了太陽(yáng)系的模擬。太陽(yáng),地球,月亮紋理加載成功。太陽(yáng),地球,月球的自轉(zhuǎn)實(shí)現(xiàn)成功,地球與月球的公轉(zhuǎn)與公轉(zhuǎn)軌道成功在屏幕顯示。通過鍵盤鍵位qweasd能成功對(duì)視角進(jìn)行轉(zhuǎn)換。但是由于對(duì)于OpenGL的不熟悉,對(duì)于太陽(yáng),地球,月球的材質(zhì)設(shè)置未作要求,采用統(tǒng)一的材質(zhì),并且對(duì)于光源設(shè)置以及其他的一些函數(shù)功能不夠熟悉,使得最終
19、的顯示圖像并不完美。此次設(shè)計(jì)只加入了鍵盤的鍵位操作,為加入鼠標(biāo)的功能,并且通過鍵盤實(shí)現(xiàn)的功能,即:視角的轉(zhuǎn)換,并不完善,出現(xiàn)了一些問題。在有條件的狀況下,應(yīng)該更加深刻的對(duì)此次OpenGL中的使用的一些函數(shù)進(jìn)行理解與轉(zhuǎn)化,從而能有清晰的思路變化其中的函數(shù)參數(shù),使得界面呈現(xiàn)的更加美觀,并能加入更多的人機(jī)交互操作功能,而不僅僅限于幾個(gè)鍵位的操作,這樣能增加程序的趣味性。六、設(shè)計(jì)體會(huì)與小結(jié)在本次課程設(shè)計(jì)中,由于初學(xué)OpenGL,對(duì)于其中的一些函數(shù)的引用不熟練,導(dǎo)致嚴(yán)重延誤了代碼的進(jìn)程,使得無法實(shí)現(xiàn)更多的功能。例如本次設(shè)計(jì)中的紋理映射,利用gluSolidSphere()函數(shù)繪制實(shí)心圓是無法加載紋理的,而我使用的繪制球體的函數(shù)正是這個(gè)函數(shù),查閱了大量書上與網(wǎng)上的資料,問題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)農(nóng)業(yè)恢復(fù)模式-洞察及研究
- 新型防水施工工藝-洞察及研究
- 氫能政策分析-洞察及研究
- 湖泊沉積物微量元素地球化學(xué)-洞察及研究
- 財(cái)務(wù)運(yùn)營(yíng)月報(bào)
- 2025年廊坊綜合布線實(shí)訓(xùn)考核試題
- 工業(yè)粉塵在線監(jiān)測(cè)-洞察及研究
- 保密常識(shí)考試題及答案
- 安全助產(chǎn)試題及答案大全
- 安全經(jīng)濟(jì)的試題及答案
- 小學(xué)教育研究方法知到章節(jié)答案智慧樹2023年海南師范大學(xué)
- MR垂體規(guī)范化掃描方案醫(yī)學(xué)課件
- 幼兒心理健康教育論文
- 通許縣供水管網(wǎng)工程環(huán)境影響報(bào)告
- 安徽金軒科技有限公司 年產(chǎn)60萬噸硫磺制酸項(xiàng)目環(huán)境影響報(bào)告書
- 供電可靠性理論考試題庫(kù)大全-中(判斷題)
- 營(yíng)養(yǎng)性維生素D缺乏性佝僂病
- 【護(hù)士資格考試】南京同仁醫(yī)院模擬檢測(cè)練習(xí)題
- (完整word版)省級(jí)溫室氣體清單編制指南
- 2023年西安市華山中心醫(yī)院招聘醫(yī)學(xué)類專業(yè)人才考試歷年高頻考點(diǎn)試題含答案解析
- GB/T 7759-1996硫化橡膠、熱塑性橡膠常溫、高溫和低溫下壓縮永久變形測(cè)定
評(píng)論
0/150
提交評(píng)論