飛行姿態(tài)的三維動態(tài)畢業(yè)論文_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  飛行姿態(tài)的三維動態(tài)實時顯示</p><p><b>  摘要</b></p><p>  三維視景仿真是虛擬現(xiàn)實領(lǐng)域的主要研究課題,它能利用計算機(jī)為人們建立一個逼真度和可信度都較高的虛擬場景,在當(dāng)前很多領(lǐng)域中都有了廣泛的應(yīng)用,包括交互式的游戲娛樂、大型的工程漫游、城市規(guī)劃等。尤其是在軍事方面關(guān)于武器研制和飛行器試驗中,通過該手段可以獲取豐富的仿真

2、數(shù)據(jù),是一種經(jīng)濟(jì)方便的可視化分析和研究的方法。</p><p>  本文基于OpenGL,應(yīng)用Visual C++ 6.0 平臺,用C++編程對飛行器的飛行場景進(jìn)行了設(shè)計與仿真這樣做的目的是由于在實際操縱中,使用真實的飛機(jī)來訓(xùn)練新操作手的風(fēng)險和代價是很高的,所以,在實驗室中使用模擬訓(xùn)練器來訓(xùn)練是國內(nèi)外通常采用的有效方法。文章使用紋理貼圖的方法實現(xiàn)了對天空和地面的模擬,用多邊形組成了飛機(jī),使用鍵盤來實現(xiàn)對飛機(jī)的操作

3、,同時添加了霧以及光照來增加場景的真實感。程序的運(yùn)行結(jié)果比較符合預(yù)期要求,對實際操縱有一定的借鑒意義。此外也可用于三維游戲設(shè)計及其他領(lǐng)域。</p><p>  關(guān)鍵詞:OpenGL,Visual C++,飛行器,紋理貼圖</p><p>  The 3D dynamic real-time display of flight attitude</p><p><

4、;b>  Abstract</b></p><p>  Three dimension visual simulation is a main research topic in the field of virtual reality, it can use the computer for people to set up a virtual scene, fidelity and reli

5、ability are higher in the current has a widespread application in many fields, including interactive game entertainment, large engineering roaming, urban planning, etc. Especially on weapons in the military field experim

6、ents, and aircraft can get rich by the means of simulation data, is an economic and convenient method of visu</p><p>  The paper uses C + + programming design and simulate the scene of aircraft flight based

7、on the OpenGL and apply Visual C + + 6.0 platform. Thanks to using the real aircraft to train new operators ,the risks and costs are high when in the actual manipulation, so at home and abroad, the effective method of tr

8、aining operators is through the training simulators in the laboratory .The article uses texture mapping method to achieve a simulation of the sky and the ground, aircraft polygons and use the </p><p>  Key w

9、ords:OpenGL,Visual C++,aircraft,Texture map </p><p><b>  目 錄</b></p><p><b>  中文摘要I</b></p><p><b>  英文摘要II</b></p><p><b> 

10、 1 緒論1</b></p><p><b>  1.1前言1</b></p><p>  1.2國內(nèi)外相關(guān)研究情況2</p><p>  1.3本文研究的目的及主要內(nèi)容2</p><p><b>  2 實時性4</b></p><p><b

11、>  2.1實時性4</b></p><p>  2.2實時性的重要性4</p><p>  2.3實時性的實現(xiàn)4</p><p>  2.3.1顯示列表的優(yōu)勢5</p><p>  2.3.2顯示列表的適用場合5</p><p>  2.3.3創(chuàng)建顯示列表6</p><

12、;p>  2.3.4執(zhí)行顯示列表6</p><p>  2.3.5管理顯示列表6</p><p>  3 三維模型操作及場景繪制原理8</p><p><b>  3.1基本框架8</b></p><p>  3.1.1構(gòu)建應(yīng)用程序框架8</p><p>  3.1.2建立圖形操

13、作描述表8</p><p>  3.1.3設(shè)置像素格式8</p><p><b>  3.2坐標(biāo)變換9</b></p><p>  3.2.1視圖變換11</p><p>  3.2.2模型變換11</p><p>  3.2.3投影變換12</p><p> 

14、 3.2.4視區(qū)變換12</p><p>  3.3紋理映射12</p><p>  3.3.1紋理12</p><p>  3.3.2紋理數(shù)據(jù)13</p><p>  3.4漫游的原理14</p><p>  3.5屏幕顯示15</p><p>  4 場景的構(gòu)建17</

15、p><p>  4.1天空的構(gòu)建17</p><p><b>  4.2地面19</b></p><p>  4.2.1地面的生成19</p><p>  4.2.2地面中的水23</p><p><b>  4.3飛行器24</b></p><p&

16、gt;  4.3.1飛行器的構(gòu)建24</p><p>  4.3.2材質(zhì)屬性的設(shè)置25</p><p>  4.3.3飛行器漫游25</p><p>  4.3.4飛行器的控制27</p><p>  4.3.5飛行器的尾焰29</p><p>  4.4場景中的光照31</p><p&

17、gt;  4.4.1光照的屬性31</p><p>  4.4.2光照的模型31</p><p>  4.5場景中的霧33</p><p>  4.5.1霧的屬性33</p><p>  4.5.2霧的生成34</p><p>  4.6本系統(tǒng)建模流程35</p><p><b

18、>  5 總結(jié)36</b></p><p><b>  參考文獻(xiàn)37</b></p><p><b>  致謝38</b></p><p>  畢業(yè)設(shè)計(論文)知識產(chǎn)權(quán)聲明39</p><p>  畢業(yè)設(shè)計(論文)獨(dú)創(chuàng)性聲明40</p><p>

19、<b>  附錄39</b></p><p>  OpenGL 簡介40</p><p><b>  1 緒論</b></p><p><b>  1.1前言</b></p><p>  科學(xué)計算可視化是2 0 世紀(jì)80 年代后期隨著計算機(jī)圖形學(xué)應(yīng)用的拓廣而發(fā)展起來的一個

20、新的研究分支, 受其推動, 各種信息的可視化成為90 年代許多學(xué)科領(lǐng)域的研究前沿。三維可視化是指以適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)建立地下特征的數(shù)學(xué)模型,采用計算機(jī)圖形技術(shù)將數(shù)學(xué)描述以3D 真實感圖像的形式予以表現(xiàn)。三維可視化技術(shù)對于地下構(gòu)造研究十分重要, 三維可視化模型能夠形象地表達(dá)地下構(gòu)造的“真實” 形態(tài)特征以及構(gòu)造要素的空間關(guān)系, 結(jié)合三維信息處理和空間分析功能可以使地下構(gòu)造分析更為直觀、準(zhǔn)確, 為地下構(gòu)造三維可視化研究開拓了一條現(xiàn)實的途徑。怎樣把

21、海底地貌地形通過計算機(jī)形象地、直觀地顯示出來, 實現(xiàn)飛行器場景的逼真顯現(xiàn), 就是本系統(tǒng)的研究目的。目前, OpenGL 在虛擬現(xiàn)實領(lǐng)域是功能較強(qiáng), 最具發(fā)展前途的實現(xiàn)工具。OpenGL 是美國高級圖形和高性能計算機(jī)系統(tǒng)公司( SGI) 所開發(fā)的三維圖形庫, 在當(dāng)前已經(jīng)成為事實上的高性能圖形和交互式視景處理的標(biāo)準(zhǔn)[2]。OpenGL是一個獨(dú)立的工作平臺, 用它編寫的程序可以在不同的硬件平臺(如工作站或個人微機(jī)中使用, 也可以在多種操作系統(tǒng)

22、(如Windows 系列、OS/2 </p><p>  的問題。但是圖形設(shè)備接口是為一般的應(yīng)用程序而提供的,因此不能滿足游戲所必須的速度要求。OpenGL允許完全繞過GDI,直接和圖形硬件打交道。 OpenGL實用庫(GLU)是OpenGL的補(bǔ)充,它提供了更高一層的函數(shù),GLU的功能廣泛,既有OpenGL函數(shù)的簡單封裝,也有能支持高級的繪制技術(shù)的復(fù)雜組件。OpenGL 提供了功能強(qiáng)大的圖元繪制命令, 所有高級的

23、目標(biāo)繪制都通過這些命令來實現(xiàn), 它共包括 100 多個功能強(qiáng)大的圖形函數(shù), 分屬于三個基本的圖形庫: 基礎(chǔ)核心庫( g l-) 、應(yīng)用程序庫( Glu-) 和編程輔助庫( GLAUX-) 。在Visual C+ + 編程環(huán)境下, 能方便地調(diào)用這些函數(shù)對三維圖形進(jìn)行仿真。</p><p>  1.2國內(nèi)外相關(guān)研究情況</p><p>  飛行器仿真是可視化仿真技術(shù)的一個重要分支,是航空航天技

24、術(shù)的重要研究課題,飛行器仿真在飛行器設(shè)計、性能分析、飛行員訓(xùn)練、戰(zhàn)法分析以及國防建設(shè)中起著十分重要的作用,在當(dāng)今國內(nèi)外的研究中占據(jù)著重要地位。對國內(nèi)來說,可視化仿真尤其是飛行器仿真起步較晚,不過也處于發(fā)展之中,在航空航天領(lǐng)域的可視化仿真工作,基本上還是處于使用國外的可視化仿真工具來開發(fā)應(yīng)用程序的階段,沒有達(dá)到一個相對成熟的階段,還沒有專用的可視化仿真工具,這使得可視化仿真工作始終落后于國外,因此很有必要認(rèn)真吸收國外的先進(jìn)研究成果,盡可能

25、的掌握相關(guān)的先進(jìn)軟件,在此基礎(chǔ)上進(jìn)行創(chuàng)新研究,盡量縮短差距,推動國內(nèi)可視化仿真技術(shù)的創(chuàng)新和長足發(fā)展。</p><p>  1.3本文研究的目的及主要內(nèi)容</p><p>  由于計算機(jī)軟硬技術(shù)水平的限制,科學(xué)計算在早起只能以批處理方式實現(xiàn),而不能進(jìn)行交互處理,對于大量的輸出數(shù)據(jù),只能人工方式處理,或者用繪圖工具輸出二維圖形,這種處理方式不僅效率低下,而且丟失大量的信息。近年來,隨著計算機(jī)的

26、普及和科學(xué)技術(shù)的迅速發(fā)展,天氣,衛(wèi)星以及地震勘測領(lǐng)域中的數(shù)據(jù)量越來越大,可視化技術(shù)就成為科學(xué)研究中必不可少的手段。</p><p>  在航空航天領(lǐng)域,可視化與仿真技術(shù)的結(jié)合——飛行器可視化仿真的技術(shù)應(yīng)用越來越廣泛,作用越來越突出。在航天任務(wù)選擇階段,研究人員需要進(jìn)行大量的軌道計算,而在航天發(fā)射和航天任務(wù)的執(zhí)行過程中,需要對航天工具以及航天器進(jìn)行導(dǎo)航,定位,上述工作中,都會產(chǎn)生大量的有關(guān)飛行狀態(tài)的數(shù)據(jù),將這些抽象

27、的數(shù)據(jù)在屏幕上表現(xiàn)出來,對航天任務(wù)的分析和論證,以及發(fā)射和運(yùn)行方案的選擇,都是極其重要的。</p><p>  可視化仿真的研究意義主要有以下幾點(diǎn):</p><p>  大大加快飛行數(shù)據(jù)的處理速度,使通過仿真計算或測量得到的龐大數(shù)據(jù)得到有效的利用,實現(xiàn)人和人與機(jī)之間的圖像通訊,而不是目前的圖像和數(shù)據(jù)通訊,從而使系統(tǒng)工作人員觀察到傳統(tǒng)方法難以觀察到的包含在飛行數(shù)據(jù)中的現(xiàn)象和規(guī)律使系統(tǒng)人員不僅

28、能得到計算結(jié)果,而且知道在計算過程中發(fā)生了什么情況,并可主動改變參數(shù),觀察其影響,對計算結(jié)果進(jìn)行引導(dǎo)和控制,進(jìn)而對運(yùn)行和控制方案進(jìn)行選擇。</p><p>  本文的主要研究內(nèi)容在于飛行器的空間運(yùn)動軌跡建模以及在三維可視化環(huán)境下實時模擬其運(yùn)動的姿態(tài)和軌跡,通過調(diào)用初始參數(shù)庫中的各飛行參數(shù),利用模型算法庫的優(yōu)化算法,經(jīng)過軌跡方程計算得到每一時刻軌跡上各點(diǎn)的坐標(biāo)和飛行姿態(tài)參數(shù),將其存入仿真數(shù)據(jù)結(jié)果庫; 然后再調(diào)用仿真

29、數(shù)據(jù)結(jié)果庫的數(shù)據(jù)對模型進(jìn)行實時繪制,驅(qū)動飛行器在空地作戰(zhàn)環(huán)境運(yùn)動; 最后利用粒子系統(tǒng)對飛行器產(chǎn)生的特殊效果,如火焰等進(jìn)行逼真顯示。為了使運(yùn)動軌跡可視化更加逼真,本文首先利用DEM 數(shù)據(jù)構(gòu)建地形模型,綁定上地形紋理數(shù)據(jù)后,便生成基礎(chǔ)的三維戰(zhàn)場環(huán)境; 然后在場景中加入了天空紋理,構(gòu)建了簡單的天空環(huán)境,同時使用霧化、光照等效果使空地作戰(zhàn)環(huán)境產(chǎn)生真實感,最后將制作飛行器,該飛行器是由基本的圖形組合而成的,最后根據(jù)運(yùn)動軌跡方程實時計算出飛機(jī)的飛行

30、位置,對運(yùn)動模型進(jìn)行實時繪制。</p><p><b>  2實時性</b></p><p>  本章首先對實時性的概念、重要性、實現(xiàn)方法進(jìn)行闡述,在此基礎(chǔ)上著重研究了飛行模擬中需要采用的實現(xiàn)實時性的方法。</p><p><b>  2.1實時性</b></p><p>  簡單一個字理解就是快,

31、能達(dá)到所需要的“快”就是實時了。實時系統(tǒng)不僅僅是表現(xiàn)在“快”上,而更主要的是實時系統(tǒng)必須對外來事件在限定時間內(nèi)做出反應(yīng),當(dāng)然這個限定時間的范圍是根據(jù)實際需要來定的,例如控制化學(xué)反應(yīng)過程的時間可能很長,而飛行控制系統(tǒng)的這個時間就會很短。</p><p>  2.2實時性的重要性</p><p>  無論是在工程應(yīng)用控制,飛行仿真研究,三維設(shè)計顯示及網(wǎng)絡(luò)通信等等,諸多領(lǐng)域中對實時性都有著非常高

32、的要求。工程控制中通常要求在指令發(fā)出后的很短時間內(nèi)系統(tǒng)做出響應(yīng),在不同的場合需要達(dá)到ns級、μs級。飛行仿真中要求及時精準(zhǔn),這樣才能得到更有價值的仿真數(shù)據(jù)。網(wǎng)絡(luò)通信中,誰也不希望自己指令發(fā)出后,滯后一段時間才得到信息。三維顯示中如果不能實現(xiàn)實時性,人們看到的結(jié)果往往是閃爍的畫面,具有實時性才能看到平滑具有真實感的動態(tài)場景。本文中就要求飛行器顯示的結(jié)果具有實時性。</p><p><b>  2.3實時性

33、的實現(xiàn)</b></p><p>  飛行過程就是模型進(jìn)行大量重繪的過程,如果每次都要讀取模型數(shù)據(jù)無疑會帶來很大的系統(tǒng)開銷,而且效率緩慢,響應(yīng)速度也會很低,這樣得到的結(jié)果明顯是有很大的瑕疵,不能得到飛行場景的真實性。所以這里主要是引入一個在飛行器構(gòu)建過程中特別重要的知識,就是顯示列表的概念。</p><p>  由于OpenGL顯示列表(Display List)是由一組預(yù)先存儲

34、起來的留待以后調(diào)用的OpenGL函數(shù)語句組成的,當(dāng)調(diào)用這張顯示列表時就依次執(zhí)行表中所列出的函數(shù)語句。前面內(nèi)容所舉出的例子都是瞬時給出函數(shù)命令,則OpenGL瞬時執(zhí)行相應(yīng)的命令,這種繪圖方式叫做瞬時方式(immediate mode)。本章將詳細(xì)地講述顯示列表的基本概論、創(chuàng)建、執(zhí)行、管理以及多級顯示列表的應(yīng)用等內(nèi)容。</p><p>  2.3.1顯示列表的優(yōu)勢</p><p>  Open

35、GL顯示列表的設(shè)計能優(yōu)化程序運(yùn)行性能,尤其是網(wǎng)絡(luò)性能。它被設(shè)計成命令高速緩存,而不是動態(tài)數(shù)據(jù)庫緩存。也就是說,一旦建立了顯示列表,就不能修改它。因為若顯示列表可以被修改,則顯示列表的搜索、內(nèi)存管理的執(zhí)行等開銷會降低性能。  采用顯示列表方式繪圖一般要比瞬時方式快,尤其是顯示列表方式可以大量地提高網(wǎng)絡(luò)性能,即當(dāng)通過網(wǎng)絡(luò)發(fā)出繪圖命令時,由于顯示列表駐留在服務(wù)器中,因而使網(wǎng)絡(luò)的負(fù)擔(dān)減輕到最小。另外,在單用戶的機(jī)器上,顯示列表同樣可以提高效率

36、。因為一旦顯示列表被處理成適合于圖形硬件的格式,則不同的OpenGL實現(xiàn)對命令的優(yōu)化程度也不同。例如旋轉(zhuǎn)矩陣函數(shù)glRotate*(),若將它置于顯示列表中,則可大大提高性能。因為旋轉(zhuǎn)矩陣的計算并不簡單,包含有平方、三角函數(shù)等復(fù)雜運(yùn)算,而在顯示列表中,它只被存儲為最終的旋轉(zhuǎn)矩陣,于是執(zhí)行起來如同硬件執(zhí)行函數(shù)glMultMatrix()一樣快。一般來說,顯示列表能將許多相鄰的矩陣變換結(jié)合成單個的矩陣乘法,從而加快速度。</p>

37、<p>  2.3.2顯示列表的適用場合</p><p>  并不是只要調(diào)用顯示列表就能優(yōu)化程序性能。因為調(diào)用顯示列表本身時程序也有一些開銷,若一個顯示列表太小,這個開銷將超過顯示列表的優(yōu)越性。下面給出顯示列表能最大優(yōu)化的場合:矩陣操作大部分矩陣操作需要OpenGL計算逆矩陣,矩陣及其逆矩陣都可以保存在顯示列表中。光柵位圖和圖像程序定義的光柵數(shù)據(jù)不一定是適合硬件處理的理想格式。當(dāng)編譯組織一個

38、顯列表時,OpenGL可能把數(shù)據(jù)轉(zhuǎn)換成硬件能夠接受的數(shù)據(jù),這可以有效地提高畫位圖的速度。光、材質(zhì)和光照模型當(dāng)用一個比較復(fù)雜的光照環(huán)境繪制場景時,可以為場景中的每個物體改變材質(zhì)。但是材質(zhì)計算較多,因此設(shè)置材質(zhì)可能比較慢。若把材質(zhì)定義放在顯示列表中,則每次改換材質(zhì)時就不必重新計算了。因為計算結(jié)果存儲在表中,因此能更快地繪制光照場景。紋理因為硬件的紋理格式可能與OpenGL格式不一致,若把紋理定義放在顯示列表中,則在編譯顯示列表時就能

39、對格式進(jìn)行轉(zhuǎn)換,而不是在執(zhí)行中進(jìn)行,這樣就能大大提高效率。多邊形的圖案填充模式即可將定義的圖案放在顯示列表中。</p><p>  2.3.3創(chuàng)建顯示列表</p><p>  OpenGL提供類似于繪制圖元的結(jié)構(gòu)即glBegin()與glEnd()的形式創(chuàng)建顯示列表,其相應(yīng)的函數(shù)為:</p><p>  void glNewList(GLuint list,GL

40、enum mode);</p><p>  說明一個顯示列表的開始,其后的OpenGL函數(shù)存入顯示列表中,直至調(diào)用結(jié)束表的函數(shù)(見下面)。參數(shù)list是一個正整數(shù),它標(biāo)志唯一的顯示列表。參數(shù)mode的可能值有GL_COMPILE和GL_COMPILE_AND_EXECUTE。若要使后面的函數(shù)語句只存入而不執(zhí)行,則用GL_COMPILE;若要使后面的函數(shù)語句存入表中且按瞬時方式執(zhí)行一次,則用GL_COMPILE_A

41、ND_EXECUTE。</p><p>  void glEndList(void);</p><p>  標(biāo)志顯示列表的結(jié)束。</p><p>  2.3.4執(zhí)行顯示列表</p><p>  在建立顯示列表以后就可以調(diào)用執(zhí)行顯示列表的函數(shù)來執(zhí)行它,并且允許在程序中多次執(zhí)行同一顯示列表,同時也可以與其它函數(shù)的瞬時方式混合使用。顯示列表執(zhí)行的函

42、數(shù)形式如下:</p><p>  void glCallList(GLuint list);</p><p>  執(zhí)行顯示列表。參數(shù)list指定被執(zhí)行的顯示列表。顯示列表中的函數(shù)語句按它們被存放的順序依次執(zhí)行;若list沒有定義,則不會產(chǎn)生任何事情。</p><p>  2.3.5管理顯示列表</p><p>  在上一節(jié)例子中,我們使用了一

43、個正整數(shù)作為顯示列表的索引。但是在實際應(yīng)用中,一般不采用這種方式,尤其在創(chuàng)建多個顯示列表的情況下。如果這樣做,則有可能選用某個正在被占用的索引,并且覆蓋這個已經(jīng)存在的顯示列表,對程序運(yùn)行造成危害。為了避免意外刪除,可以調(diào)用函數(shù)glGenList()來產(chǎn)生一個沒有用過的顯示列表,或調(diào)用glIsList()來決定是否指定的顯示列表被占用。此外,在管理顯示列表的過程中,還可調(diào)用函數(shù)glDeleteLists()來刪除一個或一個范圍內(nèi)的顯示列表

44、。下面分別介紹這些函數(shù):</p><p>  GLuint glGenList(GLsizei range);</p><p>  分配range個相鄰的未被占用的顯示列表索引。這個函數(shù)返回的是一個正整數(shù)索引值,它是一組連續(xù)空索引的第一個值。返回的索引都標(biāo)志為空且已被占用,以后再調(diào)用這個函數(shù)時不再返回這些索引。若申請索引的指定數(shù)目不能滿足或range為0則函數(shù)返回0。</p>

45、<p>  GLboolean glIsList(GLuint list);</p><p>  詢問顯示列表是否已被占用的情況。若索引list已被占用,則函數(shù)返回TURE;反之,返回FAULSE。</p><p>  void glDeleteLists(GLuint list,GLsizei range);</p><p>  刪除一組連續(xù)的顯示列表

46、,即從參數(shù)list所指示的顯示列表開始,刪除range個顯示列表,并且刪除后的這些索引重新有效。若刪除一個沒有建立的顯示列表則忽略刪除操作?! ‘?dāng)建立一個與已經(jīng)存在的顯示列表索引相同的顯示列表時,OpenGL將自動刪除舊表。</p><p>  3 三維模型操作及場景繪制原理</p><p><b>  3.1基本框架</b></p><p&g

47、t;  3.1.1構(gòu)建應(yīng)用程序框架</p><p>  應(yīng)用Visual C++ 6.0 建立一個基于MFC 的應(yīng)用程序框架, 并將VC 庫文件 opengl32.lib、glu32.lib 和glaux.lib包含在應(yīng)用程序中。同時還要修改工程中的相關(guān)參數(shù), 即將_CONLOLE改為_WINDOWS, 在link項,在對象、模塊欄的前面加上opengl32.lib Glut32.lib Glaux.lib gl

48、u32.lib為使OpenGL 函數(shù)庫的調(diào)用有效。接下來應(yīng)設(shè)置渲染窗口。 OpenGL 的渲染處理完全不同于Windows 的圖形設(shè)備接口GDI。要使Windows 的窗口格式為OpenGL 所接受,需進(jìn)行下面的其他設(shè)置。</p><p>  3.1.2建立圖形操作描述表</p><p>  OpenGL 作圖窗口必須設(shè)置為WM_CLIPSIBLINGS 和WM_CLIPCHILDREN

49、風(fēng)格。在Windows98/2000 系統(tǒng)下, 窗口程序首先要處理設(shè)備描述表(Device Contexts, DC), 它包括若干在窗口上如何顯示圖形的信息。而在OpenGL 程序中, 必須創(chuàng)建圖形操作描述表 ,這是DC中專用于OpenGL的一種。但是RC不同于其他的DC,它只需要一個句柄就可以任意調(diào)用OpenGL 函數(shù), 而其他DC調(diào)用每個GDI 函數(shù)時都需要一個句柄。使用時先通過wglCreateContext () 函數(shù)創(chuàng)建一個

50、RC,然后調(diào)用wglMakeCurrent() 函數(shù)啟動它, 就可在所定義的窗口內(nèi)調(diào)用OpenGL函數(shù)繪制飛行器了。</p><p>  3.1.3設(shè)置像素格式</p><p>  像素格式是對Win32 API的另一種擴(kuò)展,它指定了設(shè)備的繪圖屬性, 包括繪圖界面的顏色表示模式、顏色位數(shù)、累積緩存區(qū)、深度緩存區(qū)和模板緩存區(qū)的位數(shù)。每個OpenGL 顯示設(shè)備都支持某一特定的像素格式。在繪制創(chuàng)

51、建環(huán)境之前,像素格式必須被設(shè)置和創(chuàng)建。像素格式用PIXELFORMATDESCRIPTOR 結(jié)構(gòu)來表示, 通過設(shè)置這結(jié)構(gòu)的成員值使之支持OpenGL。建立了圖形操作描述表并初始化PIXELFORMATDESCRIPTOR結(jié)構(gòu)后, 下一步就是將此結(jié)構(gòu)傳遞給ChoosePixelFormat()函數(shù),此函數(shù)會為設(shè)備描述表選擇像素格式, 最后調(diào)用SetPixelFormat()將其設(shè)置為當(dāng)前像素格式。</p><p>

52、<b>  3.2坐標(biāo)變換</b></p><p>  變換允許我們移動,旋轉(zhuǎn)和操作3D世界中的實體。在介紹其他坐標(biāo)變換之前,先說 OpenGL中兩個基本的變換,這兩個變換在其他變換中起著重要的作用,是其他的變換的基礎(chǔ)。為了進(jìn)行變換,基本就是用變換矩陣乘以想要變換的點(diǎn),得到的結(jié)果就是變換過的新的點(diǎn),比如有一個點(diǎn)P和變換矩陣M,那么為了用變換矩陣M來變換點(diǎn)P,從而得到結(jié)果點(diǎn)P’,應(yīng)該像下面這樣

53、做:</p><p>   P ' =M * P(3-1)</p><p>  為了進(jìn)行變換,我們要使用在線性代數(shù)中被稱為的齊次坐標(biāo)。</p><p>  首先說OpenGL中的平移:要對一個點(diǎn)進(jìn)行平移變換,只需要將每個坐標(biāo)軸的增量值加上要平移的點(diǎn)的原始坐標(biāo)就行了。也就是一系列點(diǎn)和矩陣相乘的操作:例如: 有個平移矩陣:</p><p&g

54、t;  如果要用這個矩陣平移一個點(diǎn),只要用這個矩陣乘以這個點(diǎn)的矢量矩陣,就像下面這樣:</p><p>  在本文中,飛機(jī)在沒有任何操作的情況下一直沿z軸飛行,這個操作過程調(diào)用的是OpenGL中的gltranslate()函數(shù),它的內(nèi)部就封裝了上述的處理過程,對飛機(jī)模型所處的位置進(jìn)行上述變換,使得飛機(jī)一直向前飛行;</p><p><b>  接下來說旋轉(zhuǎn)變換:</b>

55、;</p><p>  旋轉(zhuǎn)變換主要運(yùn)用了三角學(xué),而且關(guān)于每個坐標(biāo)軸的旋轉(zhuǎn)都有相應(yīng)的不同的變換矩陣:</p><p>  關(guān)于x坐標(biāo)軸的旋轉(zhuǎn)變換矩陣定義如下:</p><p>  在關(guān)于x軸旋轉(zhuǎn)過程中,其x軸保持不變,關(guān)于y軸的選裝也是同樣的道理,要保持y軸的坐標(biāo)值不變,其變換矩陣如下所示:</p><p>  同樣,關(guān)于z軸的旋轉(zhuǎn),保持z軸

56、值不變:</p><p>  如果要讓一個點(diǎn)繞某一坐標(biāo)軸旋轉(zhuǎn),就用此坐標(biāo)軸的旋轉(zhuǎn)矩陣乘以這個點(diǎn),例如,講一個點(diǎn)繞z軸旋轉(zhuǎn),就像下面這樣:</p><p>  然后用這個點(diǎn)去和Z軸的變換矩陣相乘,即得到這一點(diǎn)旋轉(zhuǎn)后的結(jié)果:</p><p>  在飛機(jī)左右旋轉(zhuǎn)或者滾降的過程中,飛機(jī)所在位置都是圍繞Y軸或者X軸在旋轉(zhuǎn),雖然可以直接調(diào)用OpenGL中的glrotate()函

57、數(shù),但這個函數(shù)內(nèi)部的計算過程全部類似于上面的處理過程。</p><p>  定義了頂點(diǎn)以后,但在屏幕上顯示他們之前一共會發(fā)生3中類型的變換:視圖變換,模型變換和投影變換。其中一些關(guān)鍵名詞的意思如下:</p><p>  視圖:指定觀察者或照相機(jī)的位置;</p><p>  模型:在場景中移動物體;</p><p>  模型視圖:描述視圖和模型

58、變換的對偶性;</p><p>  投影:改變可視區(qū)域的大小或者重新設(shè)置它的形狀;</p><p>  視口:這是一種偽變換,只是對窗口上的最終輸出進(jìn)行縮放;</p><p>  視覺坐標(biāo)是進(jìn)行變換的一個非常重要的概念,它是根據(jù)觀察者的角度而言的,與可能發(fā)生的變換無關(guān),我們可以把它看成是“絕對的”屏幕坐標(biāo)。因此,視覺坐標(biāo)表示一種固定的坐標(biāo)系統(tǒng)。</p>

59、<p><b>  3.2.1視圖變換</b></p><p>  視圖變換是場景所應(yīng)用的第一個變換。它用于確定場景的拍攝點(diǎn)。在默認(rèn)情況下,在透視投影中,觀察者是從原點(diǎn)向Z軸的負(fù)方向望去。這個觀察點(diǎn)系相對于視覺坐標(biāo)系統(tǒng)進(jìn)行移動,以提供一個特定的拍攝點(diǎn)。當(dāng)觀察點(diǎn)位于原點(diǎn)時,場景中所繪制的Z值為正的物體就位于觀察者的后面。視圖變換允許把觀察點(diǎn)放在自己所希望的任何位置,并允許在任何方向

60、上觀察場景。確定視圖變換就像是在場景中放置照相機(jī)病讓他指向某個方向。作為總體原則,在進(jìn)行任何變換之前必須先指定視圖變換。原因是視圖變換的效果相當(dāng)于根據(jù)視覺坐標(biāo)系統(tǒng)移動當(dāng)前所使用的坐標(biāo)系統(tǒng)。然后,根據(jù)最新修改的坐標(biāo)系統(tǒng)進(jìn)行其他所有的后續(xù)變換。從本質(zhì)上說,它只是在繪制物體之前應(yīng)用到一個虛擬物體之上的一種模型變換。</p><p><b>  3.2.2模型變換</b></p>&l

61、t;p>  模型變換用于對模型以及模型內(nèi)部的特定物體進(jìn)行操縱。它可以移動物體,對它們進(jìn)行旋轉(zhuǎn),或者對它們進(jìn)行縮放。場景或者物體的最終外觀很大程度上取決于模型變換的應(yīng)用順序。對于移動和旋轉(zhuǎn),情況更是如此。</p><p><b>  3.2.3投影變換</b></p><p>  投影變換是在模型視圖變換之后應(yīng)用到物體的頂點(diǎn)之上的。這種投影實際定義了可視區(qū)域,并建

62、立裁剪平面。裁剪平面是3D空間的平面方程式,Open-GL用它來確定幾何圖形能否被觀察者所看到。更為具體的說,投影變換制訂了一個完成的場景(在所有的模型變換都已經(jīng)完成之后)投影到屏幕上的最終圖像,它主要包括正投影以及透視投影,在本文中主要利用透視投影。在正投影中,屏幕上所繪制的所有多邊形都按照指定的相對大小出現(xiàn)。直線和多邊形使用平行線直接映射到2D屏幕上。這意味著不管物體有多遠(yuǎn),都仍然按照相同的大小進(jìn)行繪制,平面的出現(xiàn)屏幕上。這種類型的

63、頭型通常用于渲染二維圖像和二維圖形。透視投影所顯示的場景更接近真實,他的標(biāo)志性特點(diǎn)就是透視縮短,他會使遠(yuǎn)處的物體看上去比相同大小的近處物體更小一些。3D空間中平行的直線在觀察者眼里并不總是平行的。透視投影的優(yōu)點(diǎn)是不必判斷直線將在什么地方交匯,也不必操心遠(yuǎn)處的物體是如何變小的。我們所需要做的就是用模型視圖變換指定場景,然后應(yīng)用透視視圖。</p><p><b>  3.2.4視區(qū)變換</b>&

64、lt;/p><p>  視口變換:當(dāng)上面的操作全部完成以后,最后所獲得的是場景的而為投影,將被投影到屏幕上的某個窗口。這種到窗口坐標(biāo)的映射是最后一個完成的變換,成為視口變換。通常,顏色緩沖區(qū)和窗口像素之間存在著一對一的對應(yīng)關(guān)系。</p><p><b>  3.3紋理映射</b></p><p><b>  3.3.1紋理</b&g

65、t;</p><p>  究其本質(zhì),紋理就是有些圖案,其范圍可能包括了從條紋和簡單的形狀到自然圖案,可以是程序員自己生成的,也可以是現(xiàn)成的圖片。也可以說,紋理就是一個函數(shù)textture(s,t),對于s和t在0到1之間的取值產(chǎn)生一個顏色或者亮度值。在本文的仿真中,紋理圖案使用的是現(xiàn)成的圖片。紋理可以是2D,3D,4D紋理等,但我們文中使用的是2D紋理,它通常是從圖像或者圖片文件中載入的,文中使用的是從一幅256

66、*256的現(xiàn)成圖片中載入紋理數(shù)據(jù),它是在程序運(yùn)行是才生成紋理。</p><p>  當(dāng)我們將一個紋理映射應(yīng)用到表面時,需要一種方式來定義其紋理在表面的方向,為此,我們使用所謂的參數(shù)坐標(biāo),其定義為(s,t)對于常規(guī)的紋理映射來說,s,t的值處于數(shù)值0到1之間,就是(0,1)。對于所要進(jìn)行紋理映射的表面,其上的坐標(biāo)的最大值和最小值決定了紋理映射的范圍,改變這些值就可以產(chǎn)生各種不同的紋理映射效果。</p>

67、<p><b>  3.3.2紋理數(shù)據(jù)</b></p><p>  紋理數(shù)據(jù)在本次仿真設(shè)計中占有很重要的位置,紋理數(shù)據(jù)包括圖像的數(shù)據(jù)以及紋理如何應(yīng)用到具體的模型上去,這就涉及一個紋理坐標(biāo)的問題。草地,天空,飛行器都使用紋理貼圖來增加圖形的真實感。</p><p>  紋理數(shù)據(jù)主要指的是圖像載入內(nèi)存時生成的數(shù)據(jù),它存儲在一個數(shù)組中,數(shù)組的專業(yè)名字稱為紋理對象

68、,其中,圖像的數(shù)據(jù)主要通過以下程序段載入內(nèi)存而獲得的:</p><p>  最后在上面的工作完成后,由于位圖的顏色格式為BGR,因此還必須交換R和B的值,以得到RGB數(shù)據(jù)。</p><p>  在將紋理數(shù)據(jù)從BMP文件中載入到內(nèi)存之后,將其定義為一個OpenGL紋理圖,調(diào)用OpenGL中的glTexImage()函數(shù)可以實現(xiàn),在函數(shù)被調(diào)用之后,紋理數(shù)據(jù)就會被載入并做好被使用的準(zhǔn)備,調(diào)用gl

69、GenTexture()函數(shù)將一個名字賦給紋理對象,因為紋理對象是用來存儲數(shù)據(jù)的,使其隨時準(zhǔn)備被使用。有了紋理對象,就可以將多個紋理一次性的載入內(nèi)存,以便場景繪制期間隨時引用其中的任何一個紋理。生成紋理名之后,然后使用glBindTexture()函數(shù)將此紋理對象綁定為我們將在繪制多邊形時使用的當(dāng)前紋理。如果想要使用多個紋理對象,那么每次要使用不同的紋理時都要調(diào)用glBindTexture()函數(shù)來綁定相應(yīng)的紋理對象。</p>

70、;<p>  最后當(dāng)紋理對象被綁定到其數(shù)據(jù)上以后,可以調(diào)用glBindTexture()函數(shù)來將此紋理設(shè)置為當(dāng)前的紋理狀態(tài),這樣在繪制多邊形完成后,就可以調(diào)用相應(yīng)的紋理來進(jìn)行貼圖。</p><p><b>  3.4漫游的原理</b></p><p>  在飛行器仿真中,飛行器可以在三維場景中漫游,隨著我們的移動,我們周圍的景物也在發(fā)生變化,在OpenG

71、L中,物體坐標(biāo)的移動可視為物體的移動,角度的變換,可仿真視角的效果,在行走過程中,視覺的效果在OpenGL中被模擬出來。</p><p>  在人對世界的綜合視覺觀察效果,是來源于我們的眼睛。眼睛就像一架照相機(jī),將外部映像反映到我們的大腦。在計算機(jī)3D圖形處理技術(shù)中,也有類似我們眼睛的東西glulookAt(…)觀察函數(shù),如果這個觀察點(diǎn)在Open-GL場景中的位置發(fā)生變化,我們在計算機(jī)屏幕上的圖像就發(fā)生了變化。&

72、lt;/p><p>  它的基本原理是:我們在計算機(jī)屏幕上觀看圖形時,我們的觀察點(diǎn)默認(rèn)為(0,0,0),也就是為什么我們總是要把圖形的Z坐標(biāo)設(shè)為小雨0的原因(Z大于0時圖形在屏幕外面的)。在Open-GL中觀察虛擬世界的主要函數(shù)glulookAt(…),它的主要作用是可以改變我們在場景中的觀察點(diǎn),看到前面的場景越來越近,兩邊的物體在向后退,這就是我們的觀察點(diǎn)在場景中的位置改變的結(jié)果。</p><p

73、>  glLookAt(視點(diǎn),目標(biāo)點(diǎn),視點(diǎn)方向),其中視點(diǎn)是一個三維坐標(biāo)量。X 量的變化就像是我們在場景中橫向移動,Y 量的變化就像是我們的身體高度的變化,Z 量的變化就像是我們在場景中前后移動。目標(biāo)點(diǎn),視點(diǎn)方向也分別是三維坐標(biāo)量,視點(diǎn)的變化,相當(dāng)于我們?nèi)嗽趫鼍爸械囊苿?。目?biāo)點(diǎn)的移動,相當(dāng)于我們?nèi)苏局欢?,頭或手中的相機(jī)上下左右移動的效果。視點(diǎn)方向Y=1表示我們的頭始終是正立的。</p><p>  因為g

74、lLookAt()函數(shù)在本文飛機(jī)的漫游過程中比較重要,所以下面利用圖示的方法介紹一下gllookat()函數(shù)的工作過程:</p><p>  glLookAt()函數(shù)中的三個主要變量(eye,look,up)就是像上面展示的那樣,當(dāng)我們把eye,look,up三個參數(shù)傳遞給glLookAt()函數(shù)的時候,函數(shù)可以自身算出新的坐標(biāo)系,也就相當(dāng)于將我們?nèi)说难劬υ趫鼍爸幸频搅硪粋€位置,因此漫游的過程也就是視點(diǎn)的變化過程

75、,也即坐標(biāo)系不斷改變的過程。</p><p>  但是,glLookAt()是如何計算坐標(biāo)系的三個坐標(biāo)向量呢?首先,對于Z軸可以從圖中得知,它等于look-eye,因此Z=look-eye;Y軸和X軸它們兩個都垂直于Z軸,X明顯的垂直于up向量,因為up向量一般情況下都是沿Y軸向上的,這個向量規(guī)定了我們視點(diǎn)向上的方向,因此可以得知X軸垂直于up和Z的叉積;當(dāng)X軸計算出來以后,剩下的就是Y軸向量,它必須垂直于X軸和

76、Z軸,也就是等于X軸和Z軸分量的叉積,得出這幾個坐標(biāo)軸分量的向量以后,就可以重新構(gòu)建坐標(biāo)系,也就是可以實現(xiàn)視點(diǎn)的移動,這就是glLookAt()可以實現(xiàn)視點(diǎn)移動的原理</p><p><b>  3.5屏幕顯示</b></p><p>  在OpenGL中,三維圖形最終要顯示在屏幕上,而屏幕是一個二維平面,在這個將三維圖形變成二維圖形時要經(jīng)歷以下過程:</p&g

77、t;<p>  這中間涉及的一些知識將在上面已經(jīng)詳細(xì)介紹,這里主要是了解計算機(jī)顯示三維場景的大致流程,其中主要涉及上述的三種變換:視圖變換,模型變換以及投影變換。</p><p><b>  4 場景的構(gòu)建</b></p><p>  在本文中,對于飛行器的仿真,場景構(gòu)建可謂是重中之重,構(gòu)建出好的模型對于仿真的真實性以及實效性都有很大的幫助,場景的構(gòu)建

78、大的方面主要涉及飛機(jī)的構(gòu)建,天空的構(gòu)建,地面的生成,以及像光照,霧等效果的實現(xiàn),下面就依次來講述文中各個模型是如何生成的。</p><p><b>  4.1天空的構(gòu)建</b></p><p>  天空是飛行器場景中必不可少的一部分,天空模型也有許多的生成方法,下面介紹兩種常用的方法:</p><p><b>  (1)天空盒<

79、/b></p><p>  天空盒的原理是繪制一個巨大的矩形盒子,然后在每個盒子的表面貼上天空紋理的圖片,所謂的天空盒就是用一矩形方盒作為天空遠(yuǎn)景貼圖的載體。構(gòu)成天空盒的載體是一個長方體,在它的前后左右上5個面貼有天空遠(yuǎn)景的五幅圖片,這五幅圖片必須有一個規(guī)律,即就是:</p><p>  1).圖形為BMP位圖格式,尺寸(像素點(diǎn))為2的N次方(32,64……);</p>

80、<p>  2).頂圖的4邊與前后左右圖的上邊相連;</p><p>  3).前后左右的4幅圖必須首尾相連;</p><p>  在編程的時候,按順序標(biāo)記紋理坐標(biāo)就可以構(gòu)造出所謂的天空盒,以此來模擬真實的天空。下圖便是繪制成型的天空盒。</p><p><b>  (2)球形天空</b></p><p> 

81、 在本文中,天空主要是繪制一個球,其他場景都包含在這個球內(nèi)。由于地球是球型的,所以天空像半個球一樣籠罩在大地之上。在用計算機(jī)仿真3D天空時,半球型天空模型顯然符合真實世界的天空模型。</p><p>  繪制球體時我們調(diào)用了OpenGL中的繪制球體函數(shù)。在本文中,這個實現(xiàn)過程如下:</p><p>  gluSphere(quadratic,MAX*50,20,20);</p>

82、<p>  這個球的半徑是MAX*50,設(shè)置的參數(shù)盡量大是因為要完全包括其他場景中的模型,另外兩個參數(shù)20是指兩個20定義了球圍繞和沿著z軸應(yīng)細(xì)分的份數(shù),分別類似于地球的經(jīng)線和緯線;</p><p>  天空繪制完成以后,給球體貼上天空的紋理,就構(gòu)造出真實的天空場景。在為天空貼紋理圖時,需要知道紋理坐標(biāo),在OpenGL中需要調(diào)用環(huán)境紋理貼圖算法,這個算法在球體表面上找到一個與被渲染的物體上的點(diǎn)具有相

83、同正切面的點(diǎn),并且把球體上的這個點(diǎn)的顏色繪制成那個物體上對應(yīng)的點(diǎn)的顏色。</p><p>  在自動生成紋理時可以調(diào)用:</p><p>  這些函數(shù),同時需要指定(s,t)坐標(biāo),這個生成坐標(biāo)的過程可以由GL_SPHERE_MAP紋理函數(shù)來完成,它的計算過程如下:</p><p>  (1)u是從原點(diǎn)指向頂點(diǎn)的單位向量(在視覺坐標(biāo)中);</p><

84、;p>  (2)n’是當(dāng)前法線向量,在變換為視覺坐標(biāo)之后;</p><p>  (3)r是反射向量(x,y,z),它是通過u-2n’n’u這個公式計算的。</p><p>  (4)中間值是通過下面這個公式來進(jìn)行計算的:</p><p>  (5)最后,可以使用下面這個公式來計算s和t紋理坐標(biāo)</p><p>  加上1/2的原因是為了

85、使s,t坐標(biāo)的值處于(0.0,1.0)范圍內(nèi)。</p><p>  此天空完成后的大體模型如下所示:</p><p>  圖 4-1 場景中的天空</p><p><b>  4.2地面</b></p><p>  4.2.1地面的生成</p><p>  地面模型的生成有很多的方法,究其本質(zhì)都是

86、產(chǎn)生網(wǎng)格模型,網(wǎng)格模型都是由一些平面的塊組成的,每個塊都應(yīng)用不同的紋理,這樣每個塊只有一個單獨(dú)的法向量,但擁有其自己的紋理坐標(biāo),所以,在地面的繪制過程中,每個塊的數(shù)據(jù)可以像類似下面這樣:</p><p>  1)塊頂點(diǎn)的數(shù)量;2)塊法向的索引;3)頂點(diǎn)索引的列表;4)紋理坐標(biāo)索引的列表;</p><p>  下面介紹幾種不同的經(jīng)常使用的地形的構(gòu)成方法:</p><p&g

87、t;<b> ?。?)高程地形</b></p><p>  高程地形是指由高程柵格組成的地表或地形系統(tǒng)。當(dāng)在屏幕上將所有的這些高度值都繪制完成之后,就會得到一個代表著場景地形的網(wǎng)格。本文中的地面本身是被一個表示草地的簡單紋理所映射,同時使用了一些水的紋理來增強(qiáng)場景的真實感。</p><p>  在實際使用中,我們可以將一個256*256的灰度圖載入到內(nèi)存中,其圖中的每

88、一位像素值表示高程中的一個柵格位置,由此而確定每一個柵格位置處的高度。可以用上述灰度圖中的每一位的顏色值來指定每一個柵格的高度。在將所有柵格值載入內(nèi)存中之后,就會得到以指定間隔表示地形高度的一組數(shù)據(jù)點(diǎn),為了設(shè)置每個高度頂點(diǎn)之間的間隔或者距離,需要使用所謂的圖尺度比例,如果要增加每個高度數(shù)據(jù)點(diǎn)彼此之間的間隔,只需增大圖尺度比例因子的值即可。</p><p>  在為每個柵格位置指定頂點(diǎn)坐標(biāo)時,需要基于正在設(shè)置的坐標(biāo)

89、分量而將其柵格位置索引與圖尺度比例因子相乘,例如,當(dāng)定義了一個頂點(diǎn)的x軸坐標(biāo)分量時,就要先取得其沿軸的柵格位置并將其與尺度比例因子相乘。由于地形圖其實就是由高度值組成的柵格,那么可以創(chuàng)建一個二維頂點(diǎn)坐標(biāo)陣列,柵格將沿著x軸和z軸分布,而y軸則代表地形的高度。</p><p>  為了繪制地形圖,我們需要對于沿z軸方向的每一行柵格值使用GL_TRIANGLE_ATRIP。由于我們將使用這種方法繪制地形,所以必須以一

90、定的順序來設(shè)定頂點(diǎn),以使得可以正確的進(jìn)行繪制,基本上應(yīng)該從柵格行的一端開始,沿著x軸正方向移動,按z字形路線模式繪制頂點(diǎn),同時為了進(jìn)行正確的紋理映射,需要每次向OpenGL傳遞四個頂點(diǎn),當(dāng)?shù)竭_(dá)一行的另一端時,就移到下一行用同樣的方法再進(jìn)行繪制,如此一行一行的重復(fù)直至處理完所有的行。</p><p>  圖 4-2 高程地形繪制示意圖</p><p>  在對地形進(jìn)行紋理映射時,每四個頂點(diǎn)就

91、要制定一個紋理,因為紋理的形狀是矩形,而四個頂點(diǎn)就會定義一個由兩個三角形組成的四邊形。因此定義紋理坐標(biāo)時,應(yīng)該每個四邊形對應(yīng)一個紋理,像下面這樣:</p><p>  圖 4-3 高程紋理坐標(biāo)生成過程</p><p>  每個四邊形對應(yīng)一個紋理,這樣就可以得到一個精致的,看起來平滑的地形。完成后的基本圖形如下:</p><p>  圖 4-4 高程地形的生成畫面&l

92、t;/p><p><b>  (2)網(wǎng)格法</b></p><p>  網(wǎng)格法主要是利用OpenGL中的基本劃線函數(shù)繪制類似棋盤格式的畫面,這個做法主要運(yùn)用OpenGL中的glbegain()和glend()函數(shù),其中g(shù)lbegain()函數(shù)中的參數(shù)選擇有許多種,在網(wǎng)格法中采用的是GL_LINES,即劃線模式。在繪制過程中,調(diào)用兩個for語句,分別從x和z開始循環(huán),每次設(shè)

93、定固定增量,要想控制地面的大小,可以通過設(shè)定x和z的上限來設(shè)定,兩個循環(huán)完成后,相當(dāng)于繪制了一個碩大的棋盤,這就是網(wǎng)格法繪制地面的過程。</p><p>  完成后的圖像如下圖:</p><p>  圖 4-5 網(wǎng)格法生成的地面</p><p><b>  (3)三角形條帶法</b></p><p>  在OpenGL中

94、有一種繪制圖形的方法,叫做GL_TRANGLES_LINES,即就是本文中一直采用的繪制三角形條帶模式,本文中采用的就是一種最基本的網(wǎng)格法,即就是利用OpenGL的劃線函數(shù)畫出一個類似網(wǎng)格的平面圖,然后利用地面的構(gòu)成算法來隨機(jī)產(chǎn)生山的地面起伏高度,最終就可以產(chǎn)生隨機(jī)起伏的地面。</p><p>  地面的高度數(shù)據(jù)是利用下面的公式計算的:</p><p>  用數(shù)學(xué)術(shù)語表述就是:</p

95、><p> ?。?)用兩個for循環(huán)分別控制x和z分量,每次給定一個隨機(jī)的高度;</p><p> ?。?)從z軸開始按列依次進(jìn)行計算,每列中每一點(diǎn)的高度值都是由其他相鄰的四點(diǎn)的高度值與步驟一中的隨機(jī)高度值相加得到;</p><p>  (3)設(shè)定條件,在每次計算的過程中,假如行數(shù)和列數(shù)的值小于給定條件值,則令行數(shù)和列數(shù)決定的這點(diǎn)的高度值為0,所以接近邊緣的高度值均為每

96、次的隨機(jī)高度;</p><p> ?。?)重復(fù)以上步驟,直到所有平面點(diǎn)都被賦予高度值;</p><p><b>  具體實現(xiàn)過程是:</b></p><p>  地面草地的數(shù)據(jù)被存儲為一個二維的265*265的點(diǎn)數(shù)組,數(shù)組中的點(diǎn)代表了x方向上的255個四邊形和y方向上的255個四邊形,在程序中,為這些四邊形指定紋理坐標(biāo),從而使草地的紋理能正確的

97、被顯示出來.在本文中,繪制地面的過程如下:</p><p>  繪制完成后的地面總體模型如下:</p><p>  圖 4-6 三角帶法生成的地面</p><p>  4.2.2地面中的水</p><p>  為了完成這部分的內(nèi)容,我們來想象一下水在自然界中是什么樣子的,海平面的定義就是地球上海洋的平均高度。如果升高或者降低海平面,那么地球上

98、的水的覆蓋面積就會增加或者減少,海平面要是比較低,相應(yīng)的就會有較多的陸地,而如果海平面較高的話,陸地就會較少,所以,如果將地球的陸地看成高程地形,那么就可以知道該如何處理水了。</p><p>  我們將在場景中定義一個高度,以此作為其中水的海平面,可以是使用一個if語句進(jìn)行判斷,假如某處的高度大于給定的高度值,則這塊地域無水,假如某塊的高度小于給定高度值,則這塊地域顯示水。</p><p&g

99、t;  本文中的海平面是一個單一的多邊形,他被賦予透明的白色,以此來表示水。然后再將一個水的紋理應(yīng)用到此多邊形,使得場景更加具有真實感。水的繪制過程中,首先繪制一個一組相連接的三角形組成的邊帶,在繪制過程中,順便為每個頂點(diǎn)指定紋理坐標(biāo):</p><p>  然后將水的紋理圖貼上去,地面中添加水以后的效果如下:</p><p>  圖 4-7 場景中的水</p><p&g

100、t;<b>  4.3飛行器</b></p><p>  4.3.1飛行器的構(gòu)建</p><p>  飛機(jī)模型的構(gòu)成方法有許多種,比較常見的兩種就是:一是用基本的圖形組合成一架飛機(jī)的大概框架,然后在上面貼上飛機(jī)紋理,模擬出真實的飛機(jī);二是利用3DMAX生成的現(xiàn)成的飛機(jī)模型,本文中,我們使用多個三角形來生成飛行器,具體來說就是使用多個三角形作為飛機(jī)的主體,在組建飛機(jī)的過

101、程中,定義了一個三角形的類,每個三角形都具有法線,紋理坐標(biāo)以及頂點(diǎn),然后將每個三角形的繪制放在一個顯示列表中,通過調(diào)用顯示列表,對這些基本圖形的放大和縮小,位置移動和角度旋轉(zhuǎn),然后調(diào)用畫圖函數(shù)將其組建在一起,就可以形成最后的飛機(jī)模型。</p><p>  接下來,由于飛機(jī)是清一色的白色,不能達(dá)到真正模擬真實飛機(jī)的效果,因此我們必須使用紋理貼圖來實現(xiàn)效果,由于在繪制三角形的過程中,為每個三角形都定義了紋理坐標(biāo),所以

102、只需要將飛機(jī)外表圖片文件讀到內(nèi)存中,然后利用紋理貼圖的一些函數(shù)將飛機(jī)紋理貼到生成的飛機(jī)模型上,這樣就可以構(gòu)造出真實的飛機(jī),飛行器模型如下圖:</p><p><b>  正面:</b></p><p>  圖 4-8 飛機(jī)的正面</p><p><b>  反面:</b></p><p>  圖 4

103、-9 飛機(jī)的反面</p><p>  4.3.2材質(zhì)屬性的設(shè)置</p><p>  對飛行器的出來還包括為其設(shè)置材料屬性,這些屬性決定了飛機(jī)材質(zhì)反射相應(yīng)的光分量的程度,OpenGL根據(jù)材質(zhì)對紅綠藍(lán)光的反射來近似模擬材質(zhì)顏色。材質(zhì)也三個和光一樣的顏色屬性:環(huán)境光,散射光以及鏡面反射光。它的設(shè)置和光照的設(shè)置差不多,只不過不是同一個函數(shù)而已,設(shè)置材質(zhì)屬性的函數(shù)像下面這樣:</p>

104、<p>  其中face指定了此材質(zhì)如何應(yīng)用到物體的多邊形,可以是前面,外面等,pname通知OpenGL將要設(shè)置材質(zhì)的哪一個屬性,這個屬性和光照的完全一樣,最后這個參數(shù)可以是標(biāo)量,也可以是數(shù)組,這個要根據(jù)函數(shù)本身的名字來定。</p><p>  4.3.3飛行器漫游</p><p>  在計算機(jī)3D圖形處理技術(shù)中,在計算機(jī)屏幕上觀看圖形時,設(shè)定的觀察點(diǎn)默認(rèn)是(0,0,0),在O

105、penGL中,飛機(jī)飛行過程中的各種變換,如翻轉(zhuǎn),轉(zhuǎn)向等都是依靠glRotatef()和glTranslatef()來實現(xiàn)的,對于我們觀察飛行場景的視點(diǎn),也就是可以產(chǎn)生在場景中漫游效果則是利用glLookAt()函數(shù)來完成的,它們的主要作用是可以改變我們在OpenGL中的觀察點(diǎn),這個觀察點(diǎn)就好像是我們的眼睛,也好像是我們平時所用的攝像機(jī),飛機(jī)向前飛行,看到前面的景物越來越近,兩邊的景物在向后退,這就是我們的觀察點(diǎn)在場景中位置改變的結(jié)果。&

106、lt;/p><p>  在飛機(jī)的漫游過程中,會涉及到許多矢量數(shù)據(jù),矢量數(shù)據(jù)在飛機(jī)的旋轉(zhuǎn),視點(diǎn)的控制過程中發(fā)揮著重要的作用,具體來說就是飛機(jī)在向左向右旋轉(zhuǎn)的過程中飛機(jī)會有右側(cè)身的效果,這時就要調(diào)用函數(shù)glRotate(r,x,y,z)來產(chǎn)生這一效果。同樣的還有在控制視點(diǎn)的過程中也會用到矢量運(yùn)算,在本論文中,飛機(jī)默認(rèn)是一直向前飛行,此時就會利用漫游原理,在不進(jìn)行任何其他的操作時,飛機(jī)是沿著(0,0,z)一直向前飛行,此時

107、對于視點(diǎn)的控制就會利用gllookat()函數(shù),此函數(shù)包括視點(diǎn),視點(diǎn)方向,以及向上的向量,通過在程序中設(shè)定相應(yīng)的變量值,就可以實現(xiàn)這些效果。</p><p>  在本文中,將視點(diǎn)的位置設(shè)在飛機(jī)上,視點(diǎn)將隨飛機(jī)的移動而移動和旋轉(zhuǎn),飛機(jī)的方向是由俯仰,偏動還側(cè)偏來實現(xiàn)的,也就是相當(dāng)于飛機(jī)的旋轉(zhuǎn)角度,相應(yīng)的程序如下:</p><p>  然后設(shè)定鍵盤,通過鍵盤控制飛機(jī)的飛行狀態(tài),完成后我們就可以

108、使用鍵盤是實現(xiàn)飛機(jī)的左右上下的飛行狀態(tài)。它的基本流程如下:</p><p>  圖 4-10 控制流程圖</p><p>  4.3.4飛行器的控制</p><p>  交互式應(yīng)用程序富有成效的和激動人心的性質(zhì)之一就是用戶可以用人類自然的動作(如用鼠標(biāo)指示和單擊鼠標(biāo),按下鍵盤的不同的按鍵等)來控制程序的流程,按下鍵盤時,對于每個鍵對于應(yīng)用程序都是有用的,需要被恰當(dāng)?shù)?/p>

109、處理。當(dāng)我們按下一個按鍵的時候,就會產(chǎn)生一個相關(guān)事件,在程序中為每一個相關(guān)事件設(shè)置一個回調(diào)函數(shù)來處理這個事件。</p><p>  在本文中,是通過鍵盤對飛機(jī)進(jìn)行控制,對鍵盤的處理有很多中方法,本文是采用一個數(shù)組,數(shù)組存儲了鍵盤的ASCII值,當(dāng)某一按鍵按下時,就會產(chǎn)生一個按鍵事件,并放入到消息隊列中,程序中的回調(diào)函數(shù)處理這類事件,使它產(chǎn)生程序設(shè)計的功能。這樣我們就可以簡單方便的操作鍵盤,在文中主要運(yùn)用了一下幾個

溫馨提示

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

評論

0/150

提交評論