



全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)報(bào)告1、 實(shí)驗(yàn)?zāi)康暮鸵罄玫谄哒滤鶎W(xué)的知識(shí),試在OpenGL中繪制太陽,地球,月亮的運(yùn)動(dòng)模型,并用相應(yīng)的代碼表示出來。2、 實(shí)驗(yàn)內(nèi)容OpenGL中只提供了兩種投影方式,一種是正投影,另一種是透視投影。不管是調(diào)用哪種投影函數(shù),為了避免不必要的變換,必須調(diào)用glMAtrixMode(GL_PROJECTION )因此在本實(shí)驗(yàn)中要學(xué)習(xí)這種方法,并使用投影的方式來做題。3、 實(shí)驗(yàn)步驟1)相關(guān)算法及原理描述為了簡單起見,我們把三個(gè)天體都想象成規(guī)則的球體。而我們所使用的glut實(shí)用工具中,正好就有一個(gè)繪制球體的現(xiàn)成函數(shù):glutSolidSphere,這個(gè)函數(shù)在“原點(diǎn)”繪制出一個(gè)球體。由于坐標(biāo)是可以通過glTranslate*和glRotate*兩個(gè)函數(shù)進(jìn)行隨意變換的,所以我們就可以在任意位置繪制球體了。函數(shù)有三個(gè)參數(shù):第一個(gè)參數(shù)表示球體的半徑,后兩個(gè)參數(shù)代表了“面”的數(shù)目,簡單點(diǎn)說就是球體的精確程度,數(shù)值越大越精確,當(dāng)然代價(jià)就是速度越緩慢。這里我們只是簡單的設(shè)置后兩個(gè)參數(shù)為20。太陽在坐標(biāo)原點(diǎn),所以不需要經(jīng)過任何變換,直接繪制就可以了。地球則要復(fù)雜一點(diǎn),需要變換坐標(biāo)。由于今年已經(jīng)經(jīng)過的天數(shù)已知為day,則地球轉(zhuǎn)過的角度為day/一年的天數(shù)*360度。前面已經(jīng)假定每年都是360天,因此地球轉(zhuǎn)過的角度恰好為day。所以可以通過下面的代碼來解決:glRotatef(day, 0, 0, -1);/* 注意地球公轉(zhuǎn)是“自西向東”的,因此是饒著Z軸負(fù)方向進(jìn)行逆時(shí)針旋轉(zhuǎn) */glTranslatef(地球軌道半徑, 0, 0);glutSolidSphere(地球半徑, 20, 20);月亮是最復(fù)雜的。因?yàn)樗粌H要繞地球轉(zhuǎn),還要隨著地球繞太陽轉(zhuǎn)。但如果我們選擇地球作為參考,則月亮進(jìn)行的運(yùn)動(dòng)就是一個(gè)簡單的圓周運(yùn)動(dòng)了。如果我們先繪制地球,再繪制月亮,則只需要進(jìn)行與地球類似的變換:glRotatef(月亮旋轉(zhuǎn)的角度, 0, 0, -1);glTranslatef(月亮軌道半徑, 0, 0);glutSolidSphere(月亮半徑, 20, 20);但這個(gè)“月亮旋轉(zhuǎn)的角度”,并不能簡單的理解為day/一個(gè)月的天數(shù)30*360度。因?yàn)槲覀冊(cè)诶L制地球時(shí),這個(gè)坐標(biāo)已經(jīng)是旋轉(zhuǎn)過的?,F(xiàn)在的旋轉(zhuǎn)是在以前的基礎(chǔ)上進(jìn)行旋轉(zhuǎn),因此還需要處理這個(gè)“差值”。我們可以寫成:day/30*360 - day,即減去原來已經(jīng)轉(zhuǎn)過的角度。這只是一種簡單的處理,當(dāng)然也可以在繪制地球前用glPushMatrix保存矩陣,繪制地球后用glPopMatrix恢復(fù)矩陣。再設(shè)計(jì)一個(gè)跟地球位置無關(guān)的月亮位置公式,來繪制月亮。通常后一種方法比前一種要好,因?yàn)楦↑c(diǎn)的運(yùn)算是不精確的,即是說我們計(jì)算地球本身的位置就是不精確的。拿這個(gè)不精確的數(shù)去計(jì)算月亮的位置,會(huì)導(dǎo)致 “不精確”的成分累積,過多的“不精確”會(huì)造成錯(cuò)誤。我們這個(gè)小程序沒有去考慮這個(gè),但并不是說這個(gè)問題不重要。還有一個(gè)需要注意的細(xì)節(jié): OpenGL把三維坐標(biāo)中的物體繪制到二維屏幕,繪制的順序是按照代碼的順序來進(jìn)行的。因此后繪制的物體會(huì)遮住先繪制的物體,即使后繪制的物體在先繪制的物體的“后面”也是如此。使用深度測試可以解決這一問題。使用的方法是:1、以GL_DEPTH_TEST為參數(shù)調(diào)用glEnable函數(shù),啟動(dòng)深度測試。2、在必要時(shí)(通常是每次繪制畫面開始時(shí)),清空深度緩沖,即:glClear(GL_DEPTH_BUFFER_BIT);其中,glClear (GL_COLOR_BUFFER_BIT)與glClear(GL_DEPTH_BUFFER_BIT)可以合并寫為:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);且后者的運(yùn)行速度可能比前者快。到此為止,我們終于可以得到整個(gè)“太陽,地球和月亮”系統(tǒng)的完整代碼。程序調(diào)試、測試與運(yùn)行結(jié)果分析2)運(yùn)行結(jié)果如下圖,程序調(diào)試成功,并且能正常顯示,不足之處:調(diào)試了半天,右鍵顯示及調(diào)節(jié)屬性的功能仍舊沒法實(shí)現(xiàn),最后不得不把那個(gè)函數(shù)刪掉,感覺很是遺憾。4、 實(shí)驗(yàn)總結(jié)通過本次試驗(yàn),進(jìn)一步認(rèn)識(shí),感覺OpenGL的功能很強(qiáng)大,居然可以實(shí)現(xiàn)三維的動(dòng)畫變換,程序調(diào)試成功后把我樂壞了!由于自己不太擅長編程,所以有些功能還不能完全實(shí)現(xiàn),但我會(huì)盡自己最大努力來克服自己的編程不足之處,多加練習(xí)。 5、附錄帶注釋的源程序#include static int day = 200; / day的變化:從0到359void myDisplay(void) glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 400000000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1); / 紅色的“太陽” glColor3f(1.0f, 0.0f, 0.0f); glutSolidSphere(69600000, 100, 100); / 藍(lán)色的“地球” glColor3f(0.0f, 0.0f, 1.0f); glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(150000000, 0.0f, 0.0f); glutSolidSphere(15945000, 100, 100); / 黃色的“月亮” glColor3f(1.0f, 1.0f, 0.0f); glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(38000000, 0.0f, 0.0f); glutSolidSphere(4345000, 100, 100); glFlush(); glutSwapBuffers();void myIdle(void) +day; if( day = 360 ) day = 0; myDisplay();int main(int argc, char *argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100, 1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年4月網(wǎng)絡(luò)搭建模擬試題及答案(附解析)
- 怎樣進(jìn)行創(chuàng)新設(shè)計(jì)
- 3月汽車發(fā)動(dòng)機(jī)檢修試題含參考答案解析
- 安全項(xiàng)目風(fēng)險(xiǎn)管理考核試卷
- 安全運(yùn)維招聘注意事項(xiàng)
- 肥料制造智能化控制考核試卷
- 文化創(chuàng)意創(chuàng)業(yè)生態(tài)系統(tǒng)考核試卷
- 電力工程設(shè)計(jì)考核試卷
- 學(xué)習(xí)編寫安全專項(xiàng)施工方案
- 2025年煤炭采掘機(jī)械設(shè)備合作協(xié)議書
- 八年級(jí)數(shù)學(xué)題試卷及答案
- 2025年物業(yè)管理從業(yè)人員考試試卷及答案
- 比亞迪新能源汽車業(yè)務(wù)競爭戰(zhàn)略:基于全產(chǎn)業(yè)鏈優(yōu)勢(shì)的多維剖析與展望
- 教研員考試試題及答案
- 河北檢察院試題及答案
- 2025年下半年山東濰坊市工程技師學(xué)院招聘事業(yè)單位控制總量教師35人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 部編版語文四年級(jí)下冊(cè) 26《寶葫蘆的秘密》整本書教學(xué)設(shè)計(jì)
- 《高血壓疾病診斷與治療》課件
- MOOC 大學(xué)英語聽說譯-河南理工大學(xué) 中國大學(xué)慕課答案
- 《水電工程巖爆風(fēng)險(xiǎn)評(píng)估技術(shù)規(guī)范》(NB-T 10143-2019)
- 【護(hù)理講課】肺炎病人的護(hù)理PPT
評(píng)論
0/150
提交評(píng)論