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

下載本文檔

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

文檔簡介

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

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

3、,同時(shí)添加了霧以及光照來增加場景的真實(shí)感。程序的運(yùn)行結(jié)果比較符合預(yù)期要求,對(duì)實(shí)際操縱有一定的借鑒意義。此外也可用于三維游戲設(shè)計(jì)及其他領(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 實(shí)時(shí)性4</b></p><p><b

11、>  2.1實(shí)時(shí)性4</b></p><p>  2.2實(shí)時(shí)性的重要性4</p><p>  2.3實(shí)時(shí)性的實(shí)現(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è)計(jì)(論文)知識(shí)產(chǎn)權(quán)聲明39</p><p>  畢業(yè)設(shè)計(jì)(論文)獨(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é)計(jì)算可視化是2 0 世紀(jì)80 年代后期隨著計(jì)算機(jī)圖形學(xué)應(yīng)用的拓廣而發(fā)展起來的一個(gè)

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

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

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

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

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

25、的掌握相關(guān)的先進(jìn)軟件,在此基礎(chǔ)上進(jìn)行創(chuàng)新研究,盡量縮短差距,推動(dòng)國內(nèi)可視化仿真技術(shù)的創(chuàng)新和長足發(fā)展。</p><p>  1.3本文研究的目的及主要內(nèi)容</p><p>  由于計(jì)算機(jī)軟硬技術(shù)水平的限制,科學(xué)計(jì)算在早起只能以批處理方式實(shí)現(xiàn),而不能進(jìn)行交互處理,對(duì)于大量的輸出數(shù)據(jù),只能人工方式處理,或者用繪圖工具輸出二維圖形,這種處理方式不僅效率低下,而且丟失大量的信息。近年來,隨著計(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)行大量的軌道計(jì)算,而在航天發(fā)射和航天任務(wù)的執(zhí)行過程中,需要對(duì)航天工具以及航天器進(jìn)行導(dǎo)航,定位,上述工作中,都會(huì)產(chǎn)生大量的有關(guān)飛行狀態(tài)的數(shù)據(jù),將這些抽象

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

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

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

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

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

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

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

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

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

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

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

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

39、對(duì)格式進(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>  說明一個(gè)顯示列表的開始,其后的OpenGL函數(shù)存入顯示列表中,直至調(diào)用結(jié)束表的函數(shù)(見下面)。參數(shù)list是一個(gè)正整數(shù),它標(biāo)志唯一的顯示列表。參數(shù)mode的可能值有GL_COMPILE和GL_COMPILE_AND_EXECUTE。若要使后面的函數(shù)語句只存入而不執(zhí)行,則用GL_COMPILE;若要使后面的函數(shù)語句存入表中且按瞬時(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í)也可以與其它函數(shù)的瞬時(shí)方式混合使用。顯示列表執(zhí)行的函

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

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

44、。下面分別介紹這些函數(shù):</p><p>  GLuint glGenList(GLsizei range);</p><p>  分配range個(gè)相鄰的未被占用的顯示列表索引。這個(gè)函數(shù)返回的是一個(gè)正整數(shù)索引值,它是一組連續(xù)空索引的第一個(gè)值。返回的索引都標(biāo)志為空且已被占用,以后再調(diào)用這個(gè)函數(shù)時(shí)不再返回這些索引。若申請(qǐng)索引的指定數(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個(gè)顯示列表,并且刪除后的這些索引重新有效。若刪除一個(gè)沒有建立的顯示列表則忽略刪除操作?! ‘?dāng)建立一個(gè)與已經(jīng)存在的顯示列表索引相同的顯示列表時(shí),OpenGL將自動(dòng)刪除舊表。</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 建立一個(gè)基于MFC 的應(yīng)用程序框架, 并將VC 庫文件 opengl32.lib、glu32.lib 和glaux.lib包含在應(yīng)用程序中。同時(shí)還要修改工程中的相關(guān)參數(shù), 即將_CONLOLE改為_WINDOWS, 在link項(xiàng),在對(duì)象、模塊欄的前面加上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,它只需要一個(gè)句柄就可以任意調(diào)用OpenGL 函數(shù), 而其他DC調(diào)用每個(gè)GDI 函數(shù)時(shí)都需要一個(gè)句柄。使用時(shí)先通過wglCreateContext () 函數(shù)創(chuàng)建一個(gè)

50、RC,然后調(diào)用wglMakeCurrent() 函數(shù)啟動(dòng)它, 就可在所定義的窗口內(nèi)調(diào)用OpenGL函數(shù)繪制飛行器了。</p><p>  3.1.3設(shè)置像素格式</p><p>  像素格式是對(duì)Win32 API的另一種擴(kuò)展,它指定了設(shè)備的繪圖屬性, 包括繪圖界面的顏色表示模式、顏色位數(shù)、累積緩存區(qū)、深度緩存區(qū)和模板緩存區(qū)的位數(shù)。每個(gè)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ù)會(huì)為設(shè)備描述表選擇像素格式, 最后調(diào)用SetPixelFormat()將其設(shè)置為當(dāng)前像素格式。</p><p>

52、<b>  3.2坐標(biāo)變換</b></p><p>  變換允許我們移動(dòng),旋轉(zhuǎn)和操作3D世界中的實(shí)體。在介紹其他坐標(biāo)變換之前,先說 OpenGL中兩個(gè)基本的變換,這兩個(gè)變換在其他變換中起著重要的作用,是其他的變換的基礎(chǔ)。為了進(jìn)行變換,基本就是用變換矩陣乘以想要變換的點(diǎn),得到的結(jié)果就是變換過的新的點(diǎn),比如有一個(gè)點(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中的平移:要對(duì)一個(gè)點(diǎn)進(jìn)行平移變換,只需要將每個(gè)坐標(biāo)軸的增量值加上要平移的點(diǎn)的原始坐標(biāo)就行了。也就是一系列點(diǎn)和矩陣相乘的操作:例如: 有個(gè)平移矩陣:</p><p&g

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

55、;</p><p>  旋轉(zhuǎn)變換主要運(yùn)用了三角學(xué),而且關(guān)于每個(gè)坐標(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>  如果要讓一個(gè)點(diǎn)繞某一坐標(biāo)軸旋轉(zhuǎn),就用此坐標(biāo)軸的旋轉(zhuǎn)矩陣乘以這個(gè)點(diǎn),例如,講一個(gè)點(diǎn)繞z軸旋轉(zhuǎn),就像下面這樣:</p><p>  然后用這個(gè)點(diǎn)去和Z軸的變換矩陣相乘,即得到這一點(diǎn)旋轉(zhuǎn)后的結(jié)果:</p><p>  在飛機(jī)左右旋轉(zhuǎn)或者滾降的過程中,飛機(jī)所在位置都是圍繞Y軸或者X軸在旋轉(zhuǎn),雖然可以直接調(diào)用OpenGL中的glrotate()函

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

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

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

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

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

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

63、頭型通常用于渲染二維圖像和二維圖形。透視投影所顯示的場景更接近真實(shí),他的標(biāo)志性特點(diǎn)就是透視縮短,他會(huì)使遠(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)上面的操作全部完成以后,最后所獲得的是場景的而為投影,將被投影到屏幕上的某個(gè)窗口。這種到窗口坐標(biāo)的映射是最后一個(gè)完成的變換,成為視口變換。通常,顏色緩沖區(qū)和窗口像素之間存在著一對(duì)一的對(duì)應(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)成的圖片。也可以說,紋理就是一個(gè)函數(shù)textture(s,t),對(duì)于s和t在0到1之間的取值產(chǎn)生一個(gè)顏色或者亮度值。在本文的仿真中,紋理圖案使用的是現(xiàn)成的圖片。紋理可以是2D,3D,4D紋理等,但我們文中使用的是2D紋理,它通常是從圖像或者圖片文件中載入的,文中使用的是從一幅256

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

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

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

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

70、;<p>  最后當(dāng)紋理對(duì)象被綁定到其數(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>  在飛行器仿真中,飛行器可以在三維場景中漫游,隨著我們的移動(dòng),我們周圍的景物也在發(fā)生變化,在OpenG

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

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

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

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

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

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

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

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

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

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

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

82、<p>  這個(gè)球的半徑是MAX*50,設(shè)置的參數(shù)盡量大是因?yàn)橐耆ㄆ渌麍鼍爸械哪P?,另外兩個(gè)參數(shù)20是指兩個(gè)20定義了球圍繞和沿著z軸應(yīng)細(xì)分的份數(shù),分別類似于地球的經(jīng)線和緯線;</p><p>  天空繪制完成以后,給球體貼上天空的紋理,就構(gòu)造出真實(shí)的天空?qǐng)鼍啊T跒樘炜召N紋理圖時(shí),需要知道紋理坐標(biāo),在OpenGL中需要調(diào)用環(huán)境紋理貼圖算法,這個(gè)算法在球體表面上找到一個(gè)與被渲染的物體上的點(diǎn)具有相

83、同正切面的點(diǎn),并且把球體上的這個(gè)點(diǎn)的顏色繪制成那個(gè)物體上對(duì)應(yīng)的點(diǎn)的顏色。</p><p>  在自動(dòng)生成紋理時(shí)可以調(diào)用:</p><p>  這些函數(shù),同時(shí)需要指定(s,t)坐標(biāo),這個(gè)生成坐標(biāo)的過程可以由GL_SPHERE_MAP紋理函數(shù)來完成,它的計(jì)算過程如下:</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這個(gè)公式計(jì)算的。</p><p>  (4)中間值是通過下面這個(gè)公式來進(jìn)行計(jì)算的:</p><p>  (5)最后,可以使用下面這個(gè)公式來計(jì)算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)格模型都是由一些平面的塊組成的,每個(gè)塊都應(yīng)用不同的紋理,這樣每個(gè)塊只有一個(gè)單獨(dú)的法向量,但擁有其自己的紋理坐標(biāo),所以,在地面的繪制過程中,每個(gè)塊的數(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>  高程地形是指由高程?hào)鸥窠M成的地表或地形系統(tǒng)。當(dāng)在屏幕上將所有的這些高度值都繪制完成之后,就會(huì)得到一個(gè)代表著場景地形的網(wǎng)格。本文中的地面本身是被一個(gè)表示草地的簡單紋理所映射,同時(shí)使用了一些水的紋理來增強(qiáng)場景的真實(shí)感。</p><p>  在實(shí)際使用中,我們可以將一個(gè)256*256的灰度圖載入到內(nèi)存中,其圖中的每

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

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

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

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

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

93、定固定增量,要想控制地面的大小,可以通過設(shè)定x和z的上限來設(shè)定,兩個(gè)循環(huán)完成后,相當(dāng)于繪制了一個(gè)碩大的棋盤,這就是網(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ù)畫出一個(gè)類似網(wǎng)格的平面圖,然后利用地面的構(gòu)成算法來隨機(jī)產(chǎn)生山的地面起伏高度,最終就可以產(chǎn)生隨機(jī)起伏的地面。</p><p>  地面的高度數(shù)據(jù)是利用下面的公式計(jì)算的:</p><p>  用數(shù)學(xué)術(shù)語表述就是:</p

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

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

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

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

99、t;  本文中的海平面是一個(gè)單一的多邊形,他被賦予透明的白色,以此來表示水。然后再將一個(gè)水的紋理應(yīng)用到此多邊形,使得場景更加具有真實(shí)感。水的繪制過程中,首先繪制一個(gè)一組相連接的三角形組成的邊帶,在繪制過程中,順便為每個(gè)頂點(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ī)紋理,模擬出真實(shí)的飛機(jī);二是利用3DMAX生成的現(xiàn)成的飛機(jī)模型,本文中,我們使用多個(gè)三角形來生成飛行器,具體來說就是使用多個(gè)三角形作為飛機(jī)的主體,在組建飛機(jī)的過

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

102、只需要將飛機(jī)外表圖片文件讀到內(nèi)存中,然后利用紋理貼圖的一些函數(shù)將飛機(jī)紋理貼到生成的飛機(jī)模型上,這樣就可以構(gòu)造出真實(shí)的飛機(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>  對(duì)飛行器的出來還包括為其設(shè)置材料屬性,這些屬性決定了飛機(jī)材質(zhì)反射相應(yīng)的光分量的程度,OpenGL根據(jù)材質(zhì)對(duì)紅綠藍(lán)光的反射來近似模擬材質(zhì)顏色。材質(zhì)也三個(gè)和光一樣的顏色屬性:環(huán)境光,散射光以及鏡面反射光。它的設(shè)置和光照的設(shè)置差不多,只不過不是同一個(gè)函數(shù)而已,設(shè)置材質(zhì)屬性的函數(shù)像下面這樣:</p>

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

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

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

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

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

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

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論