freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

計(jì)算機(jī)圖形學(xué)ppt課件(已改無(wú)錯(cuò)字)

2023-06-04 12:18:44 本頁(yè)面
  

【正文】 。每個(gè)月,月亮圍著地球轉(zhuǎn)一圈。即一年有 360天,要求繪制出太陽(yáng)、地球、月亮的相對(duì)位置示意圖。 ? 首先,認(rèn)定這三個(gè)天體都是球形,且他們的運(yùn)動(dòng)軌跡處于同一水平面,建立以下坐標(biāo)系:太陽(yáng)的中心為原點(diǎn),天體軌跡所在的平面表示了 X軸與 Y軸決定的平面,且每年第一天,地球在 X軸正方向上,月亮在地球的正 X軸方向。 ? 為了得到透視效果,使用 gluPerspective來(lái)設(shè)置可視空間。假定可視角為 60度,高寬比為 。最近可視距離為 ,最遠(yuǎn)可視距離為202200000*2=400000000。即: gluPerspective (60, 1, 1, 400000000)。 59 ? 把三個(gè)天體都想象成規(guī)則的球體。而所使用的 glut實(shí)用工具中,正好就有一個(gè)繪制球體的現(xiàn)成函數(shù): glutSolidSphere,這個(gè)函數(shù)在“原點(diǎn)”繪制出一個(gè)球體。由于坐標(biāo)是可以通過(guò) glTranslate*和 glRotate*兩個(gè)函數(shù)進(jìn)行隨意變換的,所以就可以在任意位置繪制球體了。函數(shù)有三個(gè)參數(shù):第一個(gè)參數(shù)表示球體的半徑,后兩個(gè)參數(shù)代表了“面”的數(shù)目,簡(jiǎn)單點(diǎn)說(shuō)就是球體的精確程度,數(shù)值越大越精確,當(dāng)然代價(jià)就是速度越緩慢。 ? 太陽(yáng)在坐標(biāo)原點(diǎn),所以不需要經(jīng)過(guò)任何變換,直接繪制就可以了。 地球則要復(fù)雜一點(diǎn),需要變換坐標(biāo)。由于今年已經(jīng)經(jīng)過(guò)的天數(shù)已知為 day,則地球轉(zhuǎn)過(guò)的角度為 day/一年的天數(shù) *360度。前面已經(jīng)假定每年都是 360天,因此地球轉(zhuǎn)過(guò)的角度恰好為 day。所以可以通過(guò)下面的代碼來(lái)解決: glRotatef(day, 0, 0, 1)。 /* 注意地球公轉(zhuǎn)是“自西向東”的,因此是饒著 Z軸負(fù)方向進(jìn)行逆時(shí)針旋轉(zhuǎn) */ glTranslatef(地球軌道半徑 , 0, 0)。 glutSolidSphere(地球半徑 , 20, 20)。 60 ? 月亮是最復(fù)雜的。因?yàn)樗粌H要繞地球轉(zhuǎn),還要隨著地球繞太陽(yáng)轉(zhuǎn)。但如果選擇地球作為參考,則月亮進(jìn)行的運(yùn)動(dòng)就是一個(gè)簡(jiǎn)單的圓周運(yùn)動(dòng)了。如果先繪制地球,再繪制月亮,則只需要進(jìn)行與地球類(lèi)似的變換: glRotatef(月亮旋轉(zhuǎn)的角度 , 0, 0, 1)。 glTranslatef(月亮軌道半徑 , 0, 0)。 glutSolidSphere(月亮半徑 , 20, 20)。 ? 但這個(gè)“月亮旋轉(zhuǎn)的角度”,并不能簡(jiǎn)單的理解為 day/一個(gè)月的天數(shù) 30*360度。因?yàn)樵诶L制地球時(shí),這個(gè)坐標(biāo)已經(jīng)是旋轉(zhuǎn)過(guò)的?,F(xiàn)在的旋轉(zhuǎn)是在以前的基礎(chǔ)上進(jìn)行旋轉(zhuǎn),因此還需要處理這個(gè)“差值”。可以寫(xiě)成: day/30*360 day,即減去原來(lái)已經(jīng)轉(zhuǎn)過(guò)的角度。 ? 這只是一種簡(jiǎn)單的處理,當(dāng)然也可以在繪制地球前用 glPushMatrix保存矩陣,繪制地球后用 glPopMatrix恢復(fù)矩陣。再設(shè)計(jì)一個(gè)跟地球位置無(wú)關(guān)的月亮位置公式,來(lái)繪制月亮。通常后一種方法比前一種要好,因?yàn)楦↑c(diǎn)的運(yùn)算是不精確的,即是說(shuō)計(jì)算地球本身的位置就是不精確的。拿這個(gè)不精確的數(shù)去計(jì)算月亮的位置,會(huì)導(dǎo)致 “不精確”的成分累積,過(guò)多的“不精確”會(huì)造成錯(cuò)誤。 61 ? 還有一個(gè)需要注意的細(xì)節(jié): OpenGL把三維坐標(biāo)中的物體繪制到二維屏幕,繪制的順序是按照代碼的順序來(lái)進(jìn)行的。 ? 因此后繪制的物體會(huì)遮住先繪制的物體,即使后繪制的物體在先繪制的物體的“后面”也是如此。 ? 使用深度測(cè)試可以解決這一問(wèn)題。使用的方法是: ? 以 GL_DEPTH_TEST為參數(shù)調(diào)用 glEnable函數(shù),啟動(dòng)深度測(cè)試。 ? 在必要時(shí)(通常是每次繪制畫(huà)面開(kāi)始時(shí)),清空深度緩沖,即:glClear(GL_DEPTH_BUFFER_BIT)。 ? 其中, glClear (GL_COLOR_BUFFER_BIT)與glClear(GL_DEPTH_BUFFER_BIT)可以合并寫(xiě)為: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)。 且后者的運(yùn)行速度可能比前者快。 62 ? 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, 202200000, 202200000, 0, 0, 0, 0, 0, 1)。 ? ? // 繪制紅色的“太陽(yáng)” ? glColor3f(, , )。 ? glutSolidSphere(69600000, 20, 20)。 ? // 繪制藍(lán)色的“地球” ? glColor3f(, , )。 ? glRotatef(day/*, , , )。 ? glTranslatef(150000000, , )。 ? glutSolidSphere(15945000, 20, 20)。 ? // 繪制黃色的“月亮” ? glColor3f(, , )。 ? glRotatef(day/* day/*, , , )。 ? glTranslatef(38000000, , )。 ? glutSolidSphere(4345000, 20, 20)。 ? ? glFlush()。 ? 試修改 day的值,看看畫(huà)面有何變化。 63 ? OpenGL動(dòng)畫(huà) ? 想必大家都知道電影和動(dòng)畫(huà)的工作原理吧? ? 是的,快速的把看似連續(xù)的畫(huà)面一幅幅的呈現(xiàn)在人們面前。 ? 一旦每秒鐘呈現(xiàn)畫(huà)面超過(guò) 24幅,人們就會(huì)錯(cuò)以為是連續(xù)的。 ? 我們通常觀看的電視,每秒播放 25或 30幅畫(huà)面。但對(duì)于計(jì)算機(jī)來(lái)說(shuō),它可以播放更多的畫(huà)面,以達(dá)到更平滑的效果。 ? 如果速度過(guò)慢,畫(huà)面不夠平滑。如果速度過(guò)快,則人眼未必就能反應(yīng)得過(guò)來(lái)。對(duì)于一個(gè)正常人來(lái)說(shuō),每秒 60~120幅圖畫(huà)是比較合適的。具體的數(shù)值因人而異。 64 ? 假設(shè)某動(dòng)畫(huà)一共有 n幅畫(huà)面,則它的工作步驟就是: 顯示第 1幅畫(huà)面,然后等待一小段時(shí)間,直到下一個(gè) 1/24秒 顯示第 2幅畫(huà)面,然后等待一小段時(shí)間,直到下一個(gè) 1/24秒 …… 顯示第 n幅畫(huà)面,然后等待一小段時(shí)間,直到下一個(gè) 1/24秒 結(jié)束 ? 如果用 C語(yǔ)言偽代碼來(lái)描述這一過(guò)程,就是: for(i=0。 in。 ++i) { DrawScene(i)。 Wait()。 } 65 ? 雙緩沖技術(shù) 在計(jì)算機(jī)上的動(dòng)畫(huà)與實(shí)際的動(dòng)畫(huà)有些不同:實(shí)際的動(dòng)畫(huà)都是先畫(huà)好了,播放的時(shí)候直接拿出來(lái)顯示就行。計(jì)算機(jī)動(dòng)畫(huà)則是畫(huà)一張,就拿出來(lái)一張,再畫(huà)下一張,再拿出來(lái)。如果所需要繪制的圖形很簡(jiǎn)單,那么這樣也沒(méi)什么問(wèn)題。但一旦圖形比較復(fù)雜,繪制需要的時(shí)間較長(zhǎng),問(wèn)題就會(huì)變得突出。 ? 把計(jì)算機(jī)想象成一個(gè)畫(huà)圖比較快的人,假如他直接在屏幕上畫(huà)圖,而圖形比較復(fù)雜,則有可能在他只畫(huà)了某幅圖的一半的時(shí)候就被觀眾看到。而后面雖然他把畫(huà)補(bǔ)全了,但觀眾的眼睛卻又沒(méi)有反應(yīng)過(guò)來(lái),還停留在原來(lái)那個(gè)殘缺的畫(huà)面上。也就是說(shuō),有時(shí)候觀眾看到完整的圖象,有時(shí)卻又只看到殘缺的圖象,這樣就造成了屏幕的閃爍。 66 ? 如何解決這一問(wèn)題呢? ? 我們?cè)O(shè)想有兩塊畫(huà)板,畫(huà)圖的人在旁邊畫(huà),畫(huà)好以后把他手里的畫(huà)板與掛在屏幕上的畫(huà)板相交換。這樣以來(lái),觀眾就不會(huì)看到殘缺的畫(huà)了。 ? 這一技術(shù)被應(yīng)用到計(jì)算機(jī)圖形中,稱為 雙緩沖技術(shù) 。即:在存儲(chǔ)器(很有可能是顯存)中開(kāi)辟兩塊區(qū)域,一塊作為發(fā)送到顯示器的數(shù)據(jù),一塊作為繪畫(huà)的區(qū)域,在適當(dāng)?shù)臅r(shí)候交換它們。由于交換兩塊內(nèi)存區(qū)域?qū)嶋H上只需要交換兩個(gè)指針,這一方法效率非常高,所以被廣泛的采用。 ? 注意:雖然絕大多數(shù)平臺(tái)都支持雙緩沖技術(shù),但這一技術(shù)并不是OpenGL標(biāo)準(zhǔn)中的內(nèi)容。 OpenGL為了保證更好的可移植性,允許在實(shí)現(xiàn)時(shí)不使用雙緩沖技術(shù)。當(dāng)然,我們常用的 PC都是支持雙緩沖技術(shù)的。 67 ? 要啟動(dòng)雙緩沖功能,最簡(jiǎn)單的辦法就是使用 GLUT工具包。 ? 我們以前在 main函數(shù)里面寫(xiě): glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE)。 ? 其中 GLUT_SINGLE表示單緩沖,如果改成GLUT_DOUBLE就是雙緩沖了。 ? 當(dāng)然還有需要更改的地方 ——每次繪制完成時(shí),我們需要交換兩個(gè)緩沖區(qū),把繪制好的信息用于屏幕顯示(否則無(wú)論怎么繪制,還是什么都看不到)。 ? 如果使用 GLUT工具包,也可以很輕松的完成這一工作,只要在繪制完成時(shí)簡(jiǎn)單的調(diào)用 glutSwapBuffers函數(shù)就可以。 68 ? 實(shí)現(xiàn)連續(xù)動(dòng)畫(huà) 似乎沒(méi)有任何疑問(wèn),應(yīng)該把繪制動(dòng)畫(huà)的代碼寫(xiě)成下面這個(gè)樣子: for(i=0。 in。 ++i) { DrawScene(i)。 glutSwapBuffers()。 Wait()。 } ? 但事實(shí)上,這樣做不太符合窗口系統(tǒng)的程序設(shè)計(jì)思路。第一個(gè) OpenGL程序中在 main函數(shù)里寫(xiě): glutDisplayFunc(amp。myDisplay)。 意思是對(duì)系統(tǒng)說(shuō):如果你需要繪制窗口了,請(qǐng)調(diào)用 myDisplay這個(gè)函數(shù)。為什么我們不直接調(diào)用 myDisplay,而要采用這種看似“舍近求遠(yuǎn)”的做法呢? ? 原因在于程序無(wú)法掌握究竟什么時(shí)候該繪制窗口。因?yàn)橐话愕拇翱谙到y(tǒng),例如 Windows系統(tǒng),都是支持同時(shí)顯示多個(gè)窗口的。假如程序窗口碰巧被別的窗口遮住了,后來(lái)用戶又把原來(lái)遮住的窗口移開(kāi),這時(shí)窗口需要重新繪制。但無(wú)法知道這一事件發(fā)生的具體時(shí)間。因此這一切只好委托操作系統(tǒng)來(lái)辦了。 69 ? 既然 DrawScene都可以交給操作系統(tǒng)來(lái)代辦了,那讓整個(gè)循環(huán)運(yùn)行起來(lái)的工作是否也可以交給操作系統(tǒng)呢? ? 答案是肯定的。我們先前的思路是:繪制,然后等待一段時(shí)間;再繪制,再等待一段時(shí)間。但如果去掉等待的時(shí)間,就變成了繪制,繪制, …… ,不停的繪制。 ? 不能因?yàn)槲覀兊膭?dòng)畫(huà),讓其他的工作都停下來(lái)。因此,需要在 CPU空閑的時(shí)間繪制。 ? GLUT工具包提供了一個(gè)比較類(lèi)似的函數(shù): glutIdleFunc,表示在 CPU空閑的時(shí)間調(diào)用某一函數(shù)。其實(shí) GLUT還提供了一些別的函數(shù),例如“在鍵盤(pán)按下時(shí)做某事”等。 70 ? include GL/ // 太陽(yáng)、地球和月亮 // 假設(shè)每個(gè)月都是 30天 // 一年 12個(gè)月,共是 360天 static int day = 200。 // day的變化:從 0到 359 void myDisplay(void) { /**************************************************** 這里的內(nèi)容照搬上一課的,只因?yàn)槭褂昧穗p緩沖,補(bǔ)上最后這句 *****************************************************/ glutSwapBuffers()。 } void myIdle(void) { /* 新的函數(shù),在空閑時(shí)調(diào)用,作用是把日期往后移動(dòng)一天并重新繪制,達(dá)到動(dòng)畫(huà)效果 */ ++day。 if( day = 360 ) day = 0。 myDisplay()。 } 71 int main(int argc, char *argv[]) { glutInit(amp。argc, argv)。 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE)。 // 修改了參數(shù)為GLUT_DOUBLE glutInitWindowPosition(100, 100)。 glutInitWindowSize(400, 400)。 glutCreateWindow(太陽(yáng),地球和月亮 )。 // 改了窗口標(biāo)題 glutDisplayFunc(amp。myDisplay)。 glutIdleFunc(amp。myIdle)。 // 新加入了這句 glutMainLoop()。 return 0。 } ? 計(jì)算幀速 3D Mark軟件,它可以運(yùn)行各種場(chǎng)景,測(cè)出幀速,并且為你的系統(tǒng)給出評(píng)分。這里介紹一個(gè)計(jì)算幀速的方法。 ? 根據(jù)定義,幀速就是一秒鐘內(nèi)播放的畫(huà)面數(shù)目( FPS)??梢韵葴y(cè)量繪制兩幅畫(huà)面之間時(shí)間 t,然后求它的倒數(shù)即可。假如 t=,則 FPS的值就是 1/=20。 ? 理論上是如此了,可是如何得到這個(gè)時(shí)間呢?通常 C語(yǔ)言的 time函數(shù)精確度一般只到一秒,肯定是不行。 clock函數(shù)也就到十毫秒左右,還是有點(diǎn)不夠。因?yàn)?FPS為 60和 FPS為 100的時(shí)候, t的值都是十幾毫秒。 ? 知道如何測(cè)量一張紙的
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1