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

正文內(nèi)容

基于opengl的三維飛行器程序設計與仿真畢業(yè)論文(編輯修改稿)

2025-07-15 16:37 本頁面
 

【文章內(nèi)容簡介】 們在場景中的觀察點,看到前面的場景越來越近,兩邊的物體在向后退,這就是我們的觀察點在場景中的位置改變的結(jié)果。 glLookAt(視點,目標點,視點方向),其中視點是一個三維坐標量。X 量的變化就像是我們在場景中橫向移動,Y 量的變化就像是我們的身體高度的變化,Z 量的變化就像是我們在場景中前后移動。目標點,視點方向也分別是三維坐標量,視點的變化,相當于我們?nèi)嗽趫鼍爸械囊苿?。目標點的移動,相當于我們?nèi)苏局欢?,頭或手中的相機上下左右移動的效果。視點方向Y=1表示我們的頭始終是正立的。 因為glLookAt()函數(shù)在本文飛機的漫游過程中比較重要,所以下面利用圖示的方法介紹一下gllookat()函數(shù)的工作過程: up Eye look Z X圖 31 視點各向量示意圖glLookAt()函數(shù)中的三個主要變量(eye,look,up)就是像上面展示的那樣,當我們把eye,look,up三個參數(shù)傳遞給glLookAt()函數(shù)的時候,函數(shù)可以自身算出新的坐標系,也就相當于將我們?nèi)说难劬υ趫鼍爸幸频搅硪粋€位置,因此漫游的過程也就是視點的變化過程,也即坐標系不斷改變的過程。 但是,glLookAt()是如何計算坐標系的三個坐標向量呢?首先,對于Z軸可以從圖中得知,它等于lookeye,因此Z=lookeye。Y軸和X軸它們兩個都垂直于Z軸,X明顯的垂直于up向量,因為up向量一般情況下都是沿Y軸向上的,這個向量規(guī)定了我們視點向上的方向,因此可以得知X軸垂直于up和Z的叉積;當X軸計算出來以后,剩下的就是Y軸向量,它必須垂直于X軸和Z軸,也就是等于X軸和Z軸分量的叉積,得出這幾個坐標軸分量的向量以后,就可以重新構建坐標系,也就是可以實現(xiàn)視點的移動,這就是glLookAt()可以實現(xiàn)視點移動的原理 顯示列表 這里主要是引入一個在飛行器構建過程中特別重要的知識,就是顯示列表的概念。 由于飛機模型是由基本的多邊形圖形組合而成的,所以在繪制飛機的過程中,需要頻繁的調(diào)用繪制基本圖形的函數(shù),所以可以為其創(chuàng)建一個顯示列表,將繪制函數(shù)放在這些顯示列表中,在程序中可以隨時調(diào)用顯示列表來完成圖形的繪制,大大節(jié)約開銷。 顯示列表使用之前先要創(chuàng)建,這個可以使用glGenList()函數(shù)來完成此項任務,然后將相關的命令放入相應的顯示列表。它的方法和我們繪制基本圖形時所使用的glBegin()和glEnd()函數(shù)類似,它的形式是glNewList()和glEndList(),完成上述任務以后,最后就是顯示列表的執(zhí)行,這個過程可以使用glCallList()函數(shù)來完成。由于創(chuàng)建一個顯示列表需要為其分配內(nèi)存,因此當不在使用換一個顯示列表的時候,可以直接將其銷毀以防止內(nèi)存泄露。這個過程可以通過glDeleLists()來完成。 屏幕顯示 在OpenGL中,三維圖形最終要顯示在屏幕上,而屏幕是一個二維平面,在這個將三維圖形變成二維圖形時要經(jīng)歷以下過程: 眼坐標 定點坐標 (x,y,z,w) 投影矩陣模型視圖矩陣 剪裁坐標 透視分割歸一化設備 坐標視圖變換 窗 窗口坐標 (x,y)圖 32 頂點變換軌道這中間涉及的一些知識將在上面已經(jīng)詳細介紹,這里主要是了解計算機顯示三維場景的大致流程,其中主要涉及上述的三種變換:視圖變換,模型變換以及投影變換 4. 場景的構建 在本文中,對于飛行器的仿真,場景構建可謂是重中之重,構建出好的模型對于仿真的真實性以及實效性都有很大的幫助,場景的構建大的方面主要涉及飛機的構建,天空的構建,地面的生成,以及像光照,霧等效果的實現(xiàn),下面就依次來講述文中各個模型是如何生成的。 天空是飛行器場景中必不可少的一部分,天空模型也有許多的生成方法,下面介紹兩種常用的方法: (1)天空盒 天空盒的原理是繪制一個巨大的矩形盒子,然后在每個盒子的表面貼上天空紋理的圖片,所謂的天空盒就是用一矩形方盒作為天空遠景貼圖的載體。構成天空盒的載體是一個長方體,在它的前后左右上5個面貼有天空遠景的五幅圖片,這五幅圖片必須有一個規(guī)律,即就是:1).圖形為BMP位圖格式,尺寸(像素點)為2的N次方(32,64……);2).頂圖的4邊與前后左右圖的上邊相連;3).前后左右的4幅圖必須首尾相連;在編程的時候,按順序標記紋理坐標就可以構造出所謂的天空盒,以此來模擬真實的天空。下圖便是繪制成型的天空盒。 (2)球形天空 在本文中,天空主要是繪制一個球,其他場景都包含在這個球內(nèi)。由于地球是球型的,所以天空像半個球一樣籠罩在大地之上。在用計算機仿真3D天空時,半球型天空模型顯然符合真實世界的天空模型。 繪制球體時我們調(diào)用了OpenGL中的繪制球體函數(shù)。在本文中,這個實現(xiàn)過程如下:gluSphere(quadratic,MAX*50,20,20)。這個球的半徑是MAX*50,設置的參數(shù)盡量大是因為要完全包括其他場景中的模型,另外兩個參數(shù)20是指兩個20定義了球圍繞和沿著z軸應細分的份數(shù),分別類似于地球的經(jīng)線和緯線; 天空繪制完成以后,給球體貼上天空的紋理,就構造出真實的天空場景。在為天空貼紋理圖時,需要知道紋理坐標,在OpenGL中需要調(diào)用環(huán)境紋理貼圖算法,這個算法在球體表面上找到一個與被渲染的物體上的點具有相同正切面的點,并且把球體上的這個點的顏色繪制成那個物體上對應的點的顏色。在自動生成生成紋理時,可以調(diào)用:Gltexgeni(GL_s,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP)。Gltexgeni(GL_t,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);glEnable(GL_TEXTURE_GEN_S)。glEnable(GL_TEXTURE_GEN_T)。這些函數(shù),同時需要指定(s,t)坐標,這個生成坐標的過程可以由GL_SPHERE_MAP紋理函數(shù)來完成,它的計算過程如下: (1)u是從原點指向頂點的單位向量(在視覺坐標中); (2)n’是當前法線向量,在變換為視覺坐標之后; (3)r是反射向量(x,y,z),它是通過u2n’n’u這個公式計算的。(4)中間值是通過下面這個公式來進行計算的: (41) (5)最后,可以使用下面這個公式來計算s和t紋理坐標 ; (42) ; (43)加上1/2的原因是為了使s,t坐標的值處于(0.0,1.0)范圍內(nèi)。此天空完成后的大體模型如下所示:圖 41 場景中的天空 地面 地面的生成 地面模型的生成有很多的方法,究其本質(zhì)都是產(chǎn)生網(wǎng)格模型,網(wǎng)格模型都是由一些平面的塊組成的,每個塊都應用不同的紋理,這樣每個塊只有一個單獨的法向量,但擁有其自己的紋理坐標,所以,在地面的繪制過程中,每個塊的數(shù)據(jù)可以像類似下面這樣:1)塊頂點的數(shù)量;2)塊法向的索引;3)頂點索引的列表;4)紋理坐標索引的列表;下面介紹幾種不同的經(jīng)常使用的地形的構成方法:(1)高程地形 高程地形是指由高程柵格組成的地表或地形系統(tǒng)。當在屏幕上將所有的這些高度值都繪制完成之后,就會得到一個代表著場景地形的網(wǎng)格。本文中的地面本身是被一個表示草地的簡單紋理所映射,同時使用了一些水的紋理來增強場景的真實感。 在實際使用中,我們可以將一個256*256的灰度圖載入到內(nèi)存中,其圖中的每一位像素值表示高程中的一個柵格位置,由此而確定每一個柵格位置處的高度??梢杂蒙鲜龌叶葓D中的每一位的顏色值來指定每一個柵格的高度。在將所有柵格值載入內(nèi)存中之后,就會得到以指定間隔表示地形高度的一組數(shù)據(jù)點,為了設置每個高度頂點之間的間隔或者距離,需要使用所謂的圖尺度比例,如果要增加每個高度數(shù)據(jù)點彼此之間的間隔,只需增大圖尺度比例因子的值即可。 在為每個柵格位置指定頂點坐標時,需要基于正在設置的坐標分量而將其柵格位置索引與圖尺度比例因子相乘,例如,當定義了一個頂點的x軸坐標分量時,就要先取得其沿軸的柵格位置并將其與尺度比例因子相乘。由于地形圖其實就是由高度值組成的柵格,那么可以創(chuàng)建一個二維頂點坐標陣列,柵格將沿著x軸和z軸分布,而y軸則代表地形的高度。 為了繪制地形圖,我們需要對于沿z軸方向的每一行柵格值使用GL_TRIANGLE_ATRIP。由于我們將使用這種方法繪制地形,所以必須以一定的順序來設定頂點,以使得可以正確的進行繪制,基本上應該從柵格行的一端開始,沿著x軸正方向移動,按z字形路線模式繪制頂點,同時為了進行正確的紋理映射,需要每次向OpenGL傳遞四個頂點,當?shù)竭_一行的另一端時,就移到下一行用同樣的方法再進行繪制,如此一行一行的重復直至處理完所有的行。 頂點0 頂點1 頂點2 頂點3 其他頂點圖:42 高程地形繪制示意圖在對地形進行紋理映射時,每四個頂點就要制定一個紋理,因為紋理的形狀是矩形,而四個頂點就會定義一個由兩個三角形組成的四邊形。因此定義紋理坐標時,應該每個四邊形對應一個紋理,像下面這樣: 頂點0 頂點1 glTexCoord2f(,0) glTexCoord2f(,0) 頂點2 頂點3 glTexCoord2f(,0) glTexCoord2f(,0) 其他頂點圖 43 高程紋理坐標生成過程每個四邊形對應一個紋理,這樣就可以得到一個精致的,看起來平滑的地形。完成后的基本圖形如下:圖 44 高程地形的生成畫面(2)網(wǎng)格法 網(wǎng)格法主要是利用OpenGL中的基本劃線函數(shù)繪制類似棋盤格式的畫面,這個做法主要運用OpenGL中的glbegain()和glend()函數(shù),其中glbegain()函數(shù)中的參數(shù)選擇有許多種,在網(wǎng)格法中采用的是GL_LINES,即劃線模式。在繪制過程中,調(diào)用兩個for語句,分別從x和z開始循環(huán),每次設定固定增量,要想控制地面的大小,可以通過設定x和z的上限來設定,兩個循環(huán)完成后,相當于繪制了一個碩大的棋盤,這就是網(wǎng)格法繪制地面的過程。完成后的圖像如下圖:圖 45 網(wǎng)格法生成的地面(3)三角形條帶法在OpenGL中有一種繪制圖形的方法,叫做GL_TRANGLES_LINES,即就是本文中一直采用的繪制三角形條帶模式,本文中采用的就是一種最基本的網(wǎng)格法,即就是利用OpenGL的劃線函數(shù)畫出一個類似網(wǎng)格的平面圖,然后利用地面的構成算法來隨機產(chǎn)生山的地面起伏高度,最終就可以產(chǎn)生隨機起伏的地面地面的高度數(shù)據(jù)是利用下面的公式計算的:用數(shù)學術語表述就是:(1)用兩個for循環(huán)分別控制x和z分量,每次給定一個隨機的高度;(2)從z軸開始按列依次進行計算,每列中每一點的高度值都是由其他相鄰的四點的高度值與步驟一中的隨機高度值相加得到;(3)設定條件,在每次計算的過程中,假如行數(shù)和列數(shù)的值小于給定條件值,則令行數(shù)和列數(shù)決定的這點的高度值為0,所以接近邊緣的高度值均為每次的隨機高度;(4)重復以上步驟,直到所有平面點都被賦予高度值;具體實現(xiàn)過程是: 地面草地的數(shù)據(jù)被存儲為一個二維的265*265的點數(shù)組,數(shù)組中的點代表了x方向上的255個四邊形和y方向上的255個四邊形,在程序中,為這些四邊形指定紋理坐標,繪制地面的過程如下:繪制完成后的地面總體模型如下:圖 46 三角帶法生成的地面 地面中的水 為了完成這部分的內(nèi)容,我們想想象一下水在自然界中是什么樣子的,海平面的定義就是地球上海洋的平均高度。如果升高或者降低海平面,那么地球上的水的覆蓋面積就會增加或者減少,海平面要是比較低,相應的就會有較多的陸地,而如果海平面較高的話,陸地就會較少,所以,如果將地球的陸地看成高程地形,那么就可以知道該如何處理水了。 我們將在場景中定義一個高度,以此作為其中水的海平面,可以是使用一個if語句進行判斷,假如某處的高度大于給定的高度值,則這塊地域無水,假如某塊的高度小于給定高度值,則這塊地域顯示水。 本文中的海明面是一個單一的多邊形,他被賦予透明的白色,以此來表示水。然后再將一個水的紋理應用到此多邊形,使得場景更加具有真實感。水的繪制過程中,首先繪制一個一
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1