![飛行姿態(tài)的三維動(dòng)態(tài)(本科畢業(yè)論文)_第1頁](http://file4.renrendoc.com/view/3135d1384d3c3082e0076d0b264c99a5/3135d1384d3c3082e0076d0b264c99a51.gif)
![飛行姿態(tài)的三維動(dòng)態(tài)(本科畢業(yè)論文)_第2頁](http://file4.renrendoc.com/view/3135d1384d3c3082e0076d0b264c99a5/3135d1384d3c3082e0076d0b264c99a52.gif)
![飛行姿態(tài)的三維動(dòng)態(tài)(本科畢業(yè)論文)_第3頁](http://file4.renrendoc.com/view/3135d1384d3c3082e0076d0b264c99a5/3135d1384d3c3082e0076d0b264c99a53.gif)
![飛行姿態(tài)的三維動(dòng)態(tài)(本科畢業(yè)論文)_第4頁](http://file4.renrendoc.com/view/3135d1384d3c3082e0076d0b264c99a5/3135d1384d3c3082e0076d0b264c99a54.gif)
![飛行姿態(tài)的三維動(dòng)態(tài)(本科畢業(yè)論文)_第5頁](http://file4.renrendoc.com/view/3135d1384d3c3082e0076d0b264c99a5/3135d1384d3c3082e0076d0b264c99a55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、飛行姿態(tài)的三維動(dòng)態(tài)實(shí)時(shí)顯示摘要三維視景仿真是虛擬現(xiàn)實(shí)領(lǐng)域的主要研究課題,它能利用計(jì)算機(jī)為人們建立一個(gè)逼真度和可信度都較高的虛擬場(chǎng)景,在當(dāng)前很多領(lǐng)域中都有了廣泛的應(yīng)用,包括交互式的游戲娛樂、大型的工程漫游、城市規(guī)劃等。尤其是在軍事方面關(guān)于武器研制和飛行器試驗(yàn)中,通過該手段可以獲取豐富的仿真數(shù)據(jù),是一種經(jīng)濟(jì)方便的可視化分析和研究的方法。本文基于OpenGL,應(yīng)用Visual C+ 6.0 平臺(tái),用C+編程對(duì)飛行器的飛行場(chǎng)景進(jìn)行了設(shè)計(jì)與仿真這樣做的目的是由于在實(shí)際操縱中,使用真實(shí)的飛機(jī)來訓(xùn)練新操作手的風(fēng)險(xiǎn)和代價(jià)是很高的,所以,在實(shí)驗(yàn)室中使用模擬訓(xùn)練器來訓(xùn)練是國內(nèi)外通常采用的有效方法。文章使用紋理貼圖
2、的方法實(shí)現(xiàn)了對(duì)天空和地面的模擬,用多邊形組成了飛機(jī),使用鍵盤來實(shí)現(xiàn)對(duì)飛機(jī)的操作,同時(shí)添加了霧以及光照來增加場(chǎng)景的真實(shí)感。程序的運(yùn)行結(jié)果比較符合預(yù)期要求,對(duì)實(shí)際操縱有一定的借鑒意義。此外也可用于三維游戲設(shè)計(jì)及其他領(lǐng)域。關(guān)鍵詞:OpenGL,Visual C+,飛行器,紋理貼圖The 3D dynamic real-time display of flight attitudeAbstractThree dimension visual simulation is a main research topic in the field of virtual reality, it can use t
3、he computer for people to set up a virtual scene, fidelity and reliability 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 experiments, and air
4、craft can get rich by the means of simulation data, is an economic and convenient method of visualization analysis and research.The paper uses C + + programming design and simulate the scene of aircraft flight based on the OpenGL and apply Visual C + + 6.0 platform. Thanks to using the real aircraft
5、 to train new operators ,the risks and costs are high when in the actual manipulation, so at home and abroad, the effective method of training 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, ai
6、rcraft polygons and use the keyboard to the operation of the aircraft, at the same time ,adding the fog and light to increase the realism of the scene. The results of the program is in line with the expectations, further more ,it have a significance effect on the actual manipulation .Also can be use
7、d in the design of 3 d games and other fields.Key words:OpenGL,Visual C+,aircraft,Texture map 目 錄 TOC o 1-3 h z u HYPERLINK l _Toc390693408 中文摘要 PAGEREF _Toc390693408 h I HYPERLINK l _Toc390693409 HYPERLINK l _Toc390693410 英文摘要 PAGEREF _Toc390693410 h II HYPERLINK l _Toc390693411 1 緒論 PAGEREF _Toc39
8、0693411 h 1 HYPERLINK l _Toc390693412 1.1前言 PAGEREF _Toc390693412 h 1 HYPERLINK l _Toc390693413 1.2國內(nèi)外相關(guān)研究情況 PAGEREF _Toc390693413 h 2 HYPERLINK l _Toc390693414 1.3本文研究的目的及主要內(nèi)容 PAGEREF _Toc390693414 h 2 HYPERLINK l _Toc390693415 2 實(shí)時(shí)性 PAGEREF _Toc390693415 h 4 HYPERLINK l _Toc390693416 2.1實(shí)時(shí)性 PAGERE
9、F _Toc390693416 h 4 HYPERLINK l _Toc390693417 2.2實(shí)時(shí)性的重要性 PAGEREF _Toc390693417 h 4 HYPERLINK l _Toc390693418 2.3實(shí)時(shí)性的實(shí)現(xiàn) PAGEREF _Toc390693418 h 4 HYPERLINK l _Toc390693419 2.3.1顯示列表的優(yōu)勢(shì) PAGEREF _Toc390693419 h 5 HYPERLINK l _Toc390693420 2.3.2顯示列表的適用場(chǎng)合 PAGEREF _Toc390693420 h 5 HYPERLINK l _Toc3906934
10、21 2.3.3創(chuàng)建顯示列表 PAGEREF _Toc390693421 h 6 HYPERLINK l _Toc390693422 2.3.4執(zhí)行顯示列表 PAGEREF _Toc390693422 h 6 HYPERLINK l _Toc390693423 2.3.5管理顯示列表 PAGEREF _Toc390693423 h 6 HYPERLINK l _Toc390693424 3 三維模型操作及場(chǎng)景繪制原理 PAGEREF _Toc390693424 h 8 HYPERLINK l _Toc390693425 3.1基本框架 PAGEREF _Toc390693425 h 8 HYP
11、ERLINK l _Toc390693426 3.1.1構(gòu)建應(yīng)用程序框架 PAGEREF _Toc390693426 h 8 HYPERLINK l _Toc390693427 3.1.2建立圖形操作描述表 PAGEREF _Toc390693427 h 8 HYPERLINK l _Toc390693428 3.1.3設(shè)置像素格式 PAGEREF _Toc390693428 h 8 HYPERLINK l _Toc390693429 3.2坐標(biāo)變換 PAGEREF _Toc390693429 h 9 HYPERLINK l _Toc390693430 3.2.1視圖變換 PAGEREF _T
12、oc390693430 h 11 HYPERLINK l _Toc390693431 3.2.2模型變換 PAGEREF _Toc390693431 h 11 HYPERLINK l _Toc390693432 3.2.3投影變換 PAGEREF _Toc390693432 h 12 HYPERLINK l _Toc390693433 3.2.4視區(qū)變換 PAGEREF _Toc390693433 h 12 HYPERLINK l _Toc390693434 3.3紋理映射 PAGEREF _Toc390693434 h 12 HYPERLINK l _Toc390693435 3.3.1紋理
13、 PAGEREF _Toc390693435 h 12 HYPERLINK l _Toc390693436 3.3.2紋理數(shù)據(jù) PAGEREF _Toc390693436 h 13 HYPERLINK l _Toc390693437 3.4漫游的原理 PAGEREF _Toc390693437 h 14 HYPERLINK l _Toc390693438 3.5屏幕顯示 PAGEREF _Toc390693438 h 15 HYPERLINK l _Toc390693439 4 場(chǎng)景的構(gòu)建 PAGEREF _Toc390693439 h 17 HYPERLINK l _Toc390693440
14、 4.1天空的構(gòu)建 PAGEREF _Toc390693440 h 17 HYPERLINK l _Toc390693441 4.2地面 PAGEREF _Toc390693441 h 19 HYPERLINK l _Toc390693442 4.2.1地面的生成 PAGEREF _Toc390693442 h 19 HYPERLINK l _Toc390693443 4.2.2地面中的水 PAGEREF _Toc390693443 h 23 HYPERLINK l _Toc390693444 4.3飛行器 PAGEREF _Toc390693444 h 24 HYPERLINK l _Toc
15、390693445 4.3.1飛行器的構(gòu)建 PAGEREF _Toc390693445 h 24 HYPERLINK l _Toc390693446 4.3.2材質(zhì)屬性的設(shè)置 PAGEREF _Toc390693446 h 25 HYPERLINK l _Toc390693447 4.3.3飛行器漫游 PAGEREF _Toc390693447 h 25 HYPERLINK l _Toc390693448 4.3.4飛行器的控制 PAGEREF _Toc390693448 h 27 HYPERLINK l _Toc390693449 4.3.5飛行器的尾焰 PAGEREF _Toc390693
16、449 h 29 HYPERLINK l _Toc390693450 4.4場(chǎng)景中的光照 PAGEREF _Toc390693450 h 31 HYPERLINK l _Toc390693451 4.4.1光照的屬性 PAGEREF _Toc390693451 h 31 HYPERLINK l _Toc390693452 4.4.2光照的模型 PAGEREF _Toc390693452 h 31 HYPERLINK l _Toc390693453 4.5場(chǎng)景中的霧 PAGEREF _Toc390693453 h 33 HYPERLINK l _Toc390693454 4.5.1霧的屬性 PA
17、GEREF _Toc390693454 h 33 HYPERLINK l _Toc390693455 4.5.2霧的生成 PAGEREF _Toc390693455 h 34 HYPERLINK l _Toc390693456 4.6本系統(tǒng)建模流程 PAGEREF _Toc390693456 h 35 HYPERLINK l _Toc390693457 5 總結(jié) PAGEREF _Toc390693457 h 36 HYPERLINK l _Toc390693458 參考文獻(xiàn) PAGEREF _Toc390693458 h 37 HYPERLINK l _Toc390693459 致謝 PAG
18、EREF _Toc390693459 h 38 HYPERLINK l _Toc390693460 畢業(yè)設(shè)計(jì)(論文)知識(shí)產(chǎn)權(quán)聲明 PAGEREF _Toc390693460 h 39 HYPERLINK l _Toc390693461 畢業(yè)設(shè)計(jì)(論文)獨(dú)創(chuàng)性聲明 PAGEREF _Toc390693461 h 40 HYPERLINK l _Toc390693462 附錄 PAGEREF _Toc390693462 h 39 HYPERLINK l _Toc390693463 OpenGL 簡介 PAGEREF _Toc390693463 h 401 緒論1.1前言科學(xué)計(jì)算可視化是2 0 世紀(jì)
19、80 年代后期隨著計(jì)算機(jī)圖形學(xué)應(yīng)用的拓廣而發(fā)展起來的一個(gè)新的研究分支, 受其推動(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í)的途徑。怎樣把海底地貌地形通過計(jì)算機(jī)形象地、直觀地顯示出來, 實(shí)現(xiàn)飛行器場(chǎng)景的逼真顯現(xiàn), 就是本系統(tǒng)的研究目的。目前,
20、 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)(如Windows 系列、OS/2 等)下運(yùn)行。經(jīng)過近幾年來的發(fā)展, 虛擬現(xiàn)實(shí)技術(shù)及設(shè)備被很多領(lǐng)域應(yīng)用, 而飛行仿真是最重要的應(yīng)用領(lǐng)域之一。 Open-GL是SGI公司開發(fā)的與硬件環(huán)境和操作系統(tǒng)獨(dú)立的API,它提供了建模、坐標(biāo)變換、著色、光照、平滑等二維和三維圖形功能
21、以及紋理映射、曲線等高級(jí)功能,并且能夠生成三維場(chǎng)景,繪制三維物體Open-GL良好的交互性和代碼運(yùn)行的高效性使它已經(jīng)成為三維動(dòng)畫和虛擬現(xiàn)實(shí)場(chǎng)景開發(fā)的重要工具。OpenGL的根本目的是為硬件加速的3D繪制而設(shè)計(jì)的,為程序員提供了一個(gè)圖形硬件接口。同時(shí)一個(gè)功能強(qiáng)大的,支持底層繪制和造型能力的軟件圖形函數(shù)庫,適用于所有的主流操作系統(tǒng)平臺(tái),有著廣泛的硬件支持。是為游戲,造型以及CAD之類的圖形應(yīng)用程序而設(shè)計(jì)的。它有意識(shí)的只提供底層的繪制程序功能,這就使得程序員有了更多的控制權(quán)和靈活性。而使用這些程序可以很容易的創(chuàng)建高層的繪制和造型函數(shù)庫。 OpenGL是幾百個(gè)能夠訪問圖形硬件所有性能的函數(shù)的集合。在其
22、內(nèi)部,它是以狀態(tài)機(jī)的形式運(yùn)行的,就是一些狀態(tài)的集合,而這些狀態(tài)決定了OpenGL如何運(yùn)行。通過應(yīng)用程序編程接口,可以設(shè)置狀態(tài)機(jī)的各個(gè)狀態(tài),例如當(dāng)前的顏色,光照以及混合模式等狀態(tài)。在繪制時(shí),狀態(tài)機(jī)的當(dāng)前設(shè)置決定了每一個(gè)將被顯示的對(duì)象如何被繪制。準(zhǔn)確的掌握各種狀態(tài)機(jī)的含義以及他們所產(chǎn)生的效果是很重要的,因?yàn)橐粋€(gè)或者多個(gè)不正確的狀態(tài)基于OpenGL三維飛行器程序設(shè)計(jì)與仿真態(tài)設(shè)置,就會(huì)導(dǎo)致意想不到的結(jié)果。在Windows操作系統(tǒng)中,OpenGL可以完全替代圖形設(shè)備接口,圖形設(shè)計(jì)接口的設(shè)計(jì)使得對(duì)于Windows程序員來說圖形硬件是完全不可見的,它提供了抽象層從而避免了程序員處理與硬件相關(guān)的問題。但是圖形
23、設(shè)備接口是為一般的應(yīng)用程序而提供的,因此不能滿足游戲所必須的速度要求。OpenGL允許完全繞過GDI,直接和圖形硬件打交道。 OpenGL實(shí)用庫(GLU)是OpenGL的補(bǔ)充,它提供了更高一層的函數(shù),GLU的功能廣泛,既有OpenGL函數(shù)的簡單封裝,也有能支持高級(jí)的繪制技術(shù)的復(fù)雜組件。OpenGL 提供了功能強(qiáng)大的圖元繪制命令, 所有高級(jí)的目標(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ì)三維圖
24、形進(jìn)行仿真。1.2國內(nèi)外相關(guān)研究情況飛行器仿真是可視化仿真技術(shù)的一個(gè)重要分支,是航空航天技術(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)研究成果,盡可能的掌握相關(guān)的先進(jìn)軟件,在此基礎(chǔ)上進(jìn)行創(chuàng)新研究,盡量縮短差距,推動(dòng)國內(nèi)可
25、視化仿真技術(shù)的創(chuàng)新和長足發(fā)展。1.3本文研究的目的及主要內(nèi)容由于計(jì)算機(jī)軟硬技術(shù)水平的限制,科學(xué)計(jì)算在早起只能以批處理方式實(shí)現(xiàn),而不能進(jìn)行交互處理,對(duì)于大量的輸出數(shù)據(jù),只能人工方式處理,或者用繪圖工具輸出二維圖形,這種處理方式不僅效率低下,而且丟失大量的信息。近年來,隨著計(jì)算機(jī)的普及和科學(xué)技術(shù)的迅速發(fā)展,天氣,衛(wèi)星以及地震勘測(cè)領(lǐng)域中的數(shù)據(jù)量越來越大,可視化技術(shù)就成為科學(xué)研究中必不可少的手段。在航空航天領(lǐng)域,可視化與仿真技術(shù)的結(jié)合飛行器可視化仿真的技術(shù)應(yīng)用越來越廣泛,作用越來越突出。在航天任務(wù)選擇階段,研究人員需要進(jìn)行大量的軌道計(jì)算,而在航天發(fā)射和航天任務(wù)的執(zhí)行過程中,需要對(duì)航天工具以及航天器進(jìn)行
26、導(dǎo)航,定位,上述工作中,都會(huì)產(chǎn)生大量的有關(guān)飛行狀態(tài)的數(shù)據(jù),將這些抽象的數(shù)據(jù)在屏幕上表現(xiàn)出來,對(duì)航天任務(wù)的分析和論證,以及發(fā)射和運(yùn)行方案的選擇,都是極其重要的??梢暬抡娴难芯恳饬x主要有以下幾點(diǎn):大大加快飛行數(shù)據(jù)的處理速度,使通過仿真計(jì)算或測(cè)量得到的龐大數(shù)據(jù)得到有效的利用,實(shí)現(xiàn)人和人與機(jī)之間的圖像通訊,而不是目前的圖像和數(shù)據(jù)通訊,從而使系統(tǒng)工作人員觀察到傳統(tǒng)方法難以觀察到的包含在飛行數(shù)據(jù)中的現(xiàn)象和規(guī)律使系統(tǒng)人員不僅能得到計(jì)算結(jié)果,而且知道在計(jì)算過程中發(fā)生了什么情況,并可主動(dòng)改變參數(shù),觀察其影響,對(duì)計(jì)算結(jié)果進(jìn)行引導(dǎo)和控制,進(jìn)而對(duì)運(yùn)行和控制方案進(jìn)行選擇。本文的主要研究內(nèi)容在于飛行器的空間運(yùn)動(dòng)軌跡建模
27、以及在三維可視化環(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)用仿真數(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)場(chǎng)環(huán)境; 然后在場(chǎng)景中加入了天空紋理,構(gòu)建了簡單的天空環(huán)境,同時(shí)使用霧化、光照等效果使空地作戰(zhàn)環(huán)境產(chǎn)生真實(shí)感,最后將制作飛行器,該飛行器是由基本的圖形組
28、合而成的,最后根據(jù)運(yùn)動(dòng)軌跡方程實(shí)時(shí)計(jì)算出飛機(jī)的飛行位置,對(duì)運(yùn)動(dòng)模型進(jìn)行實(shí)時(shí)繪制。2實(shí)時(shí)性本章首先對(duì)實(shí)時(shí)性的概念、重要性、實(shí)現(xiàn)方法進(jìn)行闡述,在此基礎(chǔ)上著重研究了飛行模擬中需要采用的實(shí)現(xiàn)實(shí)時(shí)性的方法。2.1實(shí)時(shí)性簡單一個(gè)字理解就是快,能達(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ì)很短。2.2實(shí)時(shí)性的重要性無論是在工程應(yīng)用控制,飛行仿真研究,三維設(shè)計(jì)顯示及網(wǎng)絡(luò)通信等等,諸多領(lǐng)域中對(duì)實(shí)時(shí)性都有著非常高的要求。工程控制中通常
29、要求在指令發(fā)出后的很短時(shí)間內(nèi)系統(tǒng)做出響應(yīng),在不同的場(chǎ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)場(chǎng)景。本文中就要求飛行器顯示的結(jié)果具有實(shí)時(shí)性。2.3實(shí)時(shí)性的實(shí)現(xiàn)飛行過程就是模型進(jìn)行大量重繪的過程,如果每次都要讀取模型數(shù)據(jù)無疑會(huì)帶來很大的系統(tǒng)開銷,而且效率緩慢,響應(yīng)速度也會(huì)很低,這樣得到的結(jié)果明顯是有很大的瑕疵,不能得到飛行場(chǎng)景的真實(shí)性。所以這里主要是引入一個(gè)在飛行器構(gòu)建過程中特別重要的知識(shí),就是顯示
30、列表的概念。由于OpenGL顯示列表(Display List)是由一組預(yù)先存儲(chǔ)起來的留待以后調(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)容。2.3.1顯示列表的優(yōu)勢(shì)OpenGL顯示列表的設(shè)計(jì)能優(yōu)化程序運(yùn)行性能,尤其是網(wǎng)絡(luò)性能。它被設(shè)計(jì)成命令高速緩存,而不是動(dòng)態(tài)數(shù)據(jù)庫緩存。也就是說,一旦建立了顯示列表,就不能修改它。因?yàn)槿麸@示列表可以被修改,則
31、顯示列表的搜索、內(nèi)存管理的執(zhí)行等開銷會(huì)降低性能。采用顯示列表方式繪圖一般要比瞬時(shí)方式快,尤其是顯示列表方式可以大量地提高網(wǎng)絡(luò)性能,即當(dāng)通過網(wǎng)絡(luò)發(fā)出繪圖命令時(shí),由于顯示列表駐留在服務(wù)器中,因而使網(wǎng)絡(luò)的負(fù)擔(dān)減輕到最小。另外,在單用戶的機(jī)器上,顯示列表同樣可以提高效率。因?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()一
32、樣快。一般來說,顯示列表能將許多相鄰的矩陣變換結(jié)合成單個(gè)的矩陣乘法,從而加快速度。2.3.2顯示列表的適用場(chǎng)合并不是只要調(diào)用顯示列表就能優(yōu)化程序性能。因?yàn)檎{(diào)用顯示列表本身時(shí)程序也有一些開銷,若一個(gè)顯示列表太小,這個(gè)開銷將超過顯示列表的優(yōu)越性。下面給出顯示列表能最大優(yōu)化的場(chǎng)合:矩陣操作大部分矩陣操作需要OpenGL計(jì)算逆矩陣,矩陣及其逆矩陣都可以保存在顯示列表中。光柵位圖和圖像程序定義的光柵數(shù)據(jù)不一定是適合硬件處理的理想格式。當(dāng)編譯組織一個(gè)顯列表時(shí),OpenGL可能把數(shù)據(jù)轉(zhuǎn)換成硬件能夠接受的數(shù)據(jù),這可以有效地提高畫位圖的速度。光、材質(zhì)和光照模型當(dāng)用一個(gè)比較復(fù)雜的光照環(huán)境繪制場(chǎng)景時(shí),可以為場(chǎng)景中的
33、每個(gè)物體改變材質(zhì)。但是材質(zhì)計(jì)算較多,因此設(shè)置材質(zhì)可能比較慢。若把材質(zhì)定義放在顯示列表中,則每次改換材質(zhì)時(shí)就不必重新計(jì)算了。因?yàn)橛?jì)算結(jié)果存儲(chǔ)在表中,因此能更快地繪制光照?qǐng)鼍啊<y理因?yàn)橛布募y理格式可能與OpenGL格式不一致,若把紋理定義放在顯示列表中,則在編譯顯示列表時(shí)就能對(duì)格式進(jìn)行轉(zhuǎn)換,而不是在執(zhí)行中進(jìn)行,這樣就能大大提高效率。多邊形的圖案填充模式即可將定義的圖案放在顯示列表中。2.3.3創(chuàng)建顯示列表OpenGL提供類似于繪制圖元的結(jié)構(gòu)即glBegin()與glEnd()的形式創(chuàng)建顯示列表,其相應(yīng)的函數(shù)為:void glNewList(GLuint list,GLenum mode);說明一
34、個(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_AND_EXECUTE。void glEndList(void);標(biāo)志顯示列表的結(jié)束。2.3.4執(zhí)行顯示列表在建立顯示列表以后就可以調(diào)用執(zhí)行顯示列表的函數(shù)來執(zhí)行它,并且允許在程序中多次執(zhí)行同一顯示列表,同時(shí)也可以與其它函數(shù)的瞬時(shí)方式混合
35、使用。顯示列表執(zhí)行的函數(shù)形式如下:void glCallList(GLuint list);執(zhí)行顯示列表。參數(shù)list指定被執(zhí)行的顯示列表。顯示列表中的函數(shù)語句按它們被存放的順序依次執(zhí)行;若list沒有定義,則不會(huì)產(chǎn)生任何事情。2.3.5管理顯示列表在上一節(jié)例子中,我們使用了一個(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()來決定是否指定的顯
36、示列表被占用。此外,在管理顯示列表的過程中,還可調(diào)用函數(shù)glDeleteLists()來刪除一個(gè)或一個(gè)范圍內(nèi)的顯示列表。下面分別介紹這些函數(shù):GLuint glGenList(GLsizei range);分配range個(gè)相鄰的未被占用的顯示列表索引。這個(gè)函數(shù)返回的是一個(gè)正整數(shù)索引值,它是一組連續(xù)空索引的第一個(gè)值。返回的索引都標(biāo)志為空且已被占用,以后再調(diào)用這個(gè)函數(shù)時(shí)不再返回這些索引。若申請(qǐng)索引的指定數(shù)目不能滿足或range為0則函數(shù)返回0。GLboolean glIsList(GLuint list);詢問顯示列表是否已被占用的情況。若索引list已被占用,則函數(shù)返回TURE;反之,返回FAU
37、LSE。void glDeleteLists(GLuint list,GLsizei range);刪除一組連續(xù)的顯示列表,即從參數(shù)list所指示的顯示列表開始,刪除range個(gè)顯示列表,并且刪除后的這些索引重新有效。若刪除一個(gè)沒有建立的顯示列表則忽略刪除操作。當(dāng)建立一個(gè)與已經(jīng)存在的顯示列表索引相同的顯示列表時(shí),OpenGL將自動(dòng)刪除舊表。3 三維模型操作及場(chǎng)景繪制原理3.1基本框架3.1.1構(gòu)建應(yīng)用程序框架應(yīng)用Visual C+ 6.0 建立一個(gè)基于MFC 的應(yīng)用程序框架, 并將VC 庫文件 opengl32.lib、glu32.lib 和glaux.lib包含在應(yīng)用程序中。同時(shí)還要修改工程
38、中的相關(guān)參數(shù), 即將_CONLOLE改為_WINDOWS, 在link項(xiàng),在對(duì)象、模塊欄的前面加上opengl32.lib Glut32.lib Glaux.lib glu32.lib為使OpenGL 函數(shù)庫的調(diào)用有效。接下來應(yīng)設(shè)置渲染窗口。 OpenGL 的渲染處理完全不同于Windows 的圖形設(shè)備接口GDI。要使Windows 的窗口格式為OpenGL 所接受,需進(jìn)行下面的其他設(shè)置。3.1.2建立圖形操作描述表OpenGL 作圖窗口必須設(shè)置為WM_CLIPSIBLINGS 和WM_CLIPCHILDREN 風(fēng)格。在Windows98/2000 系統(tǒng)下, 窗口程序首先要處理設(shè)備描述表(De
39、vice 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è)RC,然后調(diào)用wglMakeCurrent() 函數(shù)啟動(dòng)它, 就可在所定義的窗口內(nèi)調(diào)用OpenGL函數(shù)繪制飛行器了。3.1.3設(shè)置像素格式像素格式是對(duì)Win32 API的另一種擴(kuò)展,它指定了設(shè)備的繪圖屬性, 包括繪圖界面的顏色表示模式、顏色位
40、數(shù)、累積緩存區(qū)、深度緩存區(qū)和模板緩存區(qū)的位數(shù)。每個(gè)OpenGL 顯示設(shè)備都支持某一特定的像素格式。在繪制創(chuàng)建環(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)前像素格式。3.2坐標(biāo)變換變換允許我們移動(dòng),旋轉(zhuǎn)和操作3D世界中的實(shí)體。在介紹其他坐標(biāo)變換之前,先說 Ope
41、nGL中兩個(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)該像下面這樣做: P =M * P(3-1)為了進(jìn)行變換,我們要使用在線性代數(shù)中被稱為的齊次坐標(biāo)。首先說OpenGL中的平移:要對(duì)一個(gè)點(diǎn)進(jìn)行平移變換,只需要將每個(gè)坐標(biāo)軸的增量值加上要平移的點(diǎn)的原始坐標(biāo)就行了。也就是一系列點(diǎn)和矩陣相乘的操作:例如: 有個(gè)平移矩陣:如果要用這個(gè)矩陣平移一個(gè)點(diǎn),只要用這個(gè)矩陣乘以這個(gè)點(diǎn)的矢量矩陣,就像下面這樣:在本文中,飛機(jī)在沒
42、有任何操作的情況下一直沿z軸飛行,這個(gè)操作過程調(diào)用的是OpenGL中的gltranslate()函數(shù),它的內(nèi)部就封裝了上述的處理過程,對(duì)飛機(jī)模型所處的位置進(jìn)行上述變換,使得飛機(jī)一直向前飛行;接下來說旋轉(zhuǎn)變換:旋轉(zhuǎn)變換主要運(yùn)用了三角學(xué),而且關(guān)于每個(gè)坐標(biāo)軸的旋轉(zhuǎn)都有相應(yīng)的不同的變換矩陣:關(guān)于x坐標(biāo)軸的旋轉(zhuǎn)變換矩陣定義如下:在關(guān)于x軸旋轉(zhuǎn)過程中,其x軸保持不變,關(guān)于y軸的選裝也是同樣的道理,要保持y軸的坐標(biāo)值不變,其變換矩陣如下所示:同樣,關(guān)于z軸的旋轉(zhuǎn),保持z軸值不變:如果要讓一個(gè)點(diǎn)繞某一坐標(biāo)軸旋轉(zhuǎn),就用此坐標(biāo)軸的旋轉(zhuǎn)矩陣乘以這個(gè)點(diǎn),例如,講一個(gè)點(diǎn)繞z軸旋轉(zhuǎn),就像下面這樣:然后用這個(gè)點(diǎn)去和Z軸的變
43、換矩陣相乘,即得到這一點(diǎn)旋轉(zhuǎn)后的結(jié)果:在飛機(jī)左右旋轉(zhuǎn)或者滾降的過程中,飛機(jī)所在位置都是圍繞Y軸或者X軸在旋轉(zhuǎn),雖然可以直接調(diào)用OpenGL中的glrotate()函數(shù),但這個(gè)函數(shù)內(nèi)部的計(jì)算過程全部類似于上面的處理過程。定義了頂點(diǎn)以后,但在屏幕上顯示他們之前一共會(huì)發(fā)生3中類型的變換:視圖變換,模型變換和投影變換。其中一些關(guān)鍵名詞的意思如下:視圖:指定觀察者或照相機(jī)的位置;模型:在場(chǎng)景中移動(dòng)物體;模型視圖:描述視圖和模型變換的對(duì)偶性;投影:改變可視區(qū)域的大小或者重新設(shè)置它的形狀;視口:這是一種偽變換,只是對(duì)窗口上的最終輸出進(jìn)行縮放;視覺坐標(biāo)是進(jìn)行變換的一個(gè)非常重要的概念,它是根據(jù)觀察者的角度而言的
44、,與可能發(fā)生的變換無關(guān),我們可以把它看成是“絕對(duì)的”屏幕坐標(biāo)。因此,視覺坐標(biāo)表示一種固定的坐標(biāo)系統(tǒng)。3.2.1視圖變換視圖變換是場(chǎng)景所應(yīng)用的第一個(gè)變換。它用于確定場(chǎng)景的拍攝點(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í),場(chǎng)景中所繪制的Z值為正的物體就位于觀察者的后面。視圖變換允許把觀察點(diǎn)放在自己所希望的任何位置,并允許在任何方向上觀察場(chǎng)景。確定視圖變換就像是在場(chǎng)景中放置照相機(jī)病讓他指向某個(gè)方向。作為總體原則,在進(jìn)行任何變換之前必須先指定視圖變換。原因是視圖變換的效果相當(dāng)于根據(jù)視覺坐標(biāo)系統(tǒng)移動(dòng)當(dāng)
45、前所使用的坐標(biāo)系統(tǒng)。然后,根據(jù)最新修改的坐標(biāo)系統(tǒng)進(jìn)行其他所有的后續(xù)變換。從本質(zhì)上說,它只是在繪制物體之前應(yīng)用到一個(gè)虛擬物體之上的一種模型變換。3.2.2模型變換模型變換用于對(duì)模型以及模型內(nèi)部的特定物體進(jìn)行操縱。它可以移動(dòng)物體,對(duì)它們進(jìn)行旋轉(zhuǎn),或者對(duì)它們進(jìn)行縮放。場(chǎng)景或者物體的最終外觀很大程度上取決于模型變換的應(yīng)用順序。對(duì)于移動(dòng)和旋轉(zhuǎn),情況更是如此。3.2.3投影變換投影變換是在模型視圖變換之后應(yīng)用到物體的頂點(diǎn)之上的。這種投影實(shí)際定義了可視區(qū)域,并建立裁剪平面。裁剪平面是3D空間的平面方程式,Open-GL用它來確定幾何圖形能否被觀察者所看到。更為具體的說,投影變換制訂了一個(gè)完成的場(chǎng)景(在所有的
46、模型變換都已經(jīng)完成之后)投影到屏幕上的最終圖像,它主要包括正投影以及透視投影,在本文中主要利用透視投影。在正投影中,屏幕上所繪制的所有多邊形都按照指定的相對(duì)大小出現(xiàn)。直線和多邊形使用平行線直接映射到2D屏幕上。這意味著不管物體有多遠(yuǎn),都仍然按照相同的大小進(jìn)行繪制,平面的出現(xiàn)屏幕上。這種類型的頭型通常用于渲染二維圖像和二維圖形。透視投影所顯示的場(chǎng)景更接近真實(shí),他的標(biāo)志性特點(diǎn)就是透視縮短,他會(huì)使遠(yuǎn)處的物體看上去比相同大小的近處物體更小一些。3D空間中平行的直線在觀察者眼里并不總是平行的。透視投影的優(yōu)點(diǎn)是不必判斷直線將在什么地方交匯,也不必操心遠(yuǎn)處的物體是如何變小的。我們所需要做的就是用模型視圖變換
47、指定場(chǎng)景,然后應(yīng)用透視視圖。3.2.4視區(qū)變換視口變換:當(dāng)上面的操作全部完成以后,最后所獲得的是場(chǎng)景的而為投影,將被投影到屏幕上的某個(gè)窗口。這種到窗口坐標(biāo)的映射是最后一個(gè)完成的變換,成為視口變換。通常,顏色緩沖區(qū)和窗口像素之間存在著一對(duì)一的對(duì)應(yīng)關(guān)系。3.3紋理映射3.3.1紋理究其本質(zhì),紋理就是有些圖案,其范圍可能包括了從條紋和簡單的形狀到自然圖案,可以是程序員自己生成的,也可以是現(xiàn)成的圖片。也可以說,紋理就是一個(gè)函數(shù)textture(s,t),對(duì)于s和t在0到1之間的取值產(chǎn)生一個(gè)顏色或者亮度值。在本文的仿真中,紋理圖案使用的是現(xiàn)成的圖片。紋理可以是2D,3D,4D紋理等,但我們文中使用的是2
48、D紋理,它通常是從圖像或者圖片文件中載入的,文中使用的是從一幅256*256的現(xiàn)成圖片中載入紋理數(shù)據(jù),它是在程序運(yùn)行是才生成紋理。 當(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)生各種不同的紋理映射效果。3.3.2紋理數(shù)據(jù)紋理數(shù)據(jù)在本次仿真設(shè)計(jì)中占有很重要的位置,紋理數(shù)據(jù)包括圖像的數(shù)據(jù)以及紋理如何應(yīng)用到具體的模型上去,這就涉及一個(gè)紋理坐標(biāo)的問題。草地,天空,飛
49、行器都使用紋理貼圖來增加圖形的真實(shí)感。紋理數(shù)據(jù)主要指的是圖像載入內(nèi)存時(shí)生成的數(shù)據(jù),它存儲(chǔ)在一個(gè)數(shù)組中,數(shù)組的專業(yè)名字稱為紋理對(duì)象,其中,圖像的數(shù)據(jù)主要通過以下程序段載入內(nèi)存而獲得的:最后在上面的工作完成后,由于位圖的顏色格式為BGR,因此還必須交換R和B的值,以得到RGB數(shù)據(jù)。在將紋理數(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)用glGenTexture()函數(shù)將一個(gè)名字賦給紋理對(duì)象,因?yàn)榧y理對(duì)象是用來存儲(chǔ)數(shù)據(jù)的,使其隨時(shí)準(zhǔn)備被使用。有了紋理對(duì)象,就可以將
50、多個(gè)紋理一次性的載入內(nèi)存,以便場(chǎng)景繪制期間隨時(shí)引用其中的任何一個(gè)紋理。生成紋理名之后,然后使用glBindTexture()函數(shù)將此紋理對(duì)象綁定為我們將在繪制多邊形時(shí)使用的當(dāng)前紋理。如果想要使用多個(gè)紋理對(duì)象,那么每次要使用不同的紋理時(shí)都要調(diào)用glBindTexture()函數(shù)來綁定相應(yīng)的紋理對(duì)象。最后當(dāng)紋理對(duì)象被綁定到其數(shù)據(jù)上以后,可以調(diào)用glBindTexture()函數(shù)來將此紋理設(shè)置為當(dāng)前的紋理狀態(tài),這樣在繪制多邊形完成后,就可以調(diào)用相應(yīng)的紋理來進(jìn)行貼圖。3.4漫游的原理在飛行器仿真中,飛行器可以在三維場(chǎng)景中漫游,隨著我們的移動(dòng),我們周圍的景物也在發(fā)生變化,在OpenGL中,物體坐標(biāo)的移動(dòng)
51、可視為物體的移動(dòng),角度的變換,可仿真視角的效果,在行走過程中,視覺的效果在OpenGL中被模擬出來。在人對(duì)世界的綜合視覺觀察效果,是來源于我們的眼睛。眼睛就像一架照相機(jī),將外部映像反映到我們的大腦。在計(jì)算機(jī)3D圖形處理技術(shù)中,也有類似我們眼睛的東西glulookAt()觀察函數(shù),如果這個(gè)觀察點(diǎn)在Open-GL場(chǎng)景中的位置發(fā)生變化,我們?cè)谟?jì)算機(jī)屏幕上的圖像就發(fā)生了變化。它的基本原理是:我們?cè)谟?jì)算機(jī)屏幕上觀看圖形時(shí),我們的觀察點(diǎn)默認(rèn)為(0,0,0),也就是為什么我們總是要把圖形的Z坐標(biāo)設(shè)為小雨0的原因(Z大于0時(shí)圖形在屏幕外面的)。在Open-GL中觀察虛擬世界的主要函數(shù)glulookAt(),它
52、的主要作用是可以改變我們?cè)趫?chǎng)景中的觀察點(diǎn),看到前面的場(chǎng)景越來越近,兩邊的物體在向后退,這就是我們的觀察點(diǎn)在場(chǎng)景中的位置改變的結(jié)果。glLookAt(視點(diǎn),目標(biāo)點(diǎn),視點(diǎn)方向),其中視點(diǎn)是一個(gè)三維坐標(biāo)量。X 量的變化就像是我們?cè)趫?chǎng)景中橫向移動(dòng),Y 量的變化就像是我們的身體高度的變化,Z 量的變化就像是我們?cè)趫?chǎng)景中前后移動(dòng)。目標(biāo)點(diǎn),視點(diǎn)方向也分別是三維坐標(biāo)量,視點(diǎn)的變化,相當(dāng)于我們?nèi)嗽趫?chǎng)景中的移動(dòng)。目標(biāo)點(diǎn)的移動(dòng),相當(dāng)于我們?nèi)苏局欢^或手中的相機(jī)上下左右移動(dòng)的效果。視點(diǎn)方向Y=1表示我們的頭始終是正立的。因?yàn)間lLookAt()函數(shù)在本文飛機(jī)的漫游過程中比較重要,所以下面利用圖示的方法介紹一下gl
53、lookat()函數(shù)的工作過程:glLookAt()函數(shù)中的三個(gè)主要變量(eye,look,up)就是像上面展示的那樣,當(dāng)我們把eye,look,up三個(gè)參數(shù)傳遞給glLookAt()函數(shù)的時(shí)候,函數(shù)可以自身算出新的坐標(biāo)系,也就相當(dāng)于將我們?nèi)说难劬υ趫?chǎng)景中移到另一個(gè)位置,因此漫游的過程也就是視點(diǎn)的變化過程,也即坐標(biāo)系不斷改變的過程。 但是,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)向上的
54、方向,因此可以得知X軸垂直于up和Z的叉積;當(dāng)X軸計(jì)算出來以后,剩下的就是Y軸向量,它必須垂直于X軸和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)的原理3.5屏幕顯示在OpenGL中,三維圖形最終要顯示在屏幕上,而屏幕是一個(gè)二維平面,在這個(gè)將三維圖形變成二維圖形時(shí)要經(jīng)歷以下過程:這中間涉及的一些知識(shí)將在上面已經(jīng)詳細(xì)介紹,這里主要是了解計(jì)算機(jī)顯示三維場(chǎng)景的大致流程,其中主要涉及上述的三種變換:視圖變換,模型變換以及投影變換。4 場(chǎng)景的構(gòu)建在本文中,對(duì)于飛行器的仿真,場(chǎng)景構(gòu)建可謂是重
55、中之重,構(gòu)建出好的模型對(duì)于仿真的真實(shí)性以及實(shí)效性都有很大的幫助,場(chǎng)景的構(gòu)建大的方面主要涉及飛機(jī)的構(gòu)建,天空的構(gòu)建,地面的生成,以及像光照,霧等效果的實(shí)現(xiàn),下面就依次來講述文中各個(gè)模型是如何生成的。4.1天空的構(gòu)建天空是飛行器場(chǎng)景中必不可少的一部分,天空模型也有許多的生成方法,下面介紹兩種常用的方法:(1)天空盒天空盒的原理是繪制一個(gè)巨大的矩形盒子,然后在每個(gè)盒子的表面貼上天空紋理的圖片,所謂的天空盒就是用一矩形方盒作為天空遠(yuǎn)景貼圖的載體。構(gòu)成天空盒的載體是一個(gè)長方體,在它的前后左右上5個(gè)面貼有天空遠(yuǎn)景的五幅圖片,這五幅圖片必須有一個(gè)規(guī)律,即就是:1).圖形為BMP位圖格式,尺寸(像素點(diǎn))為2的
56、N次方(32,64);2).頂圖的4邊與前后左右圖的上邊相連;3).前后左右的4幅圖必須首尾相連;在編程的時(shí)候,按順序標(biāo)記紋理坐標(biāo)就可以構(gòu)造出所謂的天空盒,以此來模擬真實(shí)的天空。下圖便是繪制成型的天空盒。(2)球形天空在本文中,天空主要是繪制一個(gè)球,其他場(chǎng)景都包含在這個(gè)球內(nèi)。由于地球是球型的,所以天空像半個(gè)球一樣籠罩在大地之上。在用計(jì)算機(jī)仿真3D天空時(shí),半球型天空模型顯然符合真實(shí)世界的天空模型。繪制球體時(shí)我們調(diào)用了OpenGL中的繪制球體函數(shù)。在本文中,這個(gè)實(shí)現(xiàn)過程如下:gluSphere(quadratic,MAX*50,20,20);這個(gè)球的半徑是MAX*50,設(shè)置的參數(shù)盡量大是因?yàn)橐耆?/p>
57、包括其他場(chǎng)景中的模型,另外兩個(gè)參數(shù)20是指兩個(gè)20定義了球圍繞和沿著z軸應(yīng)細(xì)分的份數(shù),分別類似于地球的經(jīng)線和緯線;天空繪制完成以后,給球體貼上天空的紋理,就構(gòu)造出真實(shí)的天空?qǐng)鼍?。在為天空貼紋理圖時(shí),需要知道紋理坐標(biāo),在OpenGL中需要調(diào)用環(huán)境紋理貼圖算法,這個(gè)算法在球體表面上找到一個(gè)與被渲染的物體上的點(diǎn)具有相同正切面的點(diǎn),并且把球體上的這個(gè)點(diǎn)的顏色繪制成那個(gè)物體上對(duì)應(yīng)的點(diǎn)的顏色。在自動(dòng)生成紋理時(shí)可以調(diào)用:這些函數(shù),同時(shí)需要指定(s,t)坐標(biāo),這個(gè)生成坐標(biāo)的過程可以由GL_SPHERE_MAP紋理函數(shù)來完成,它的計(jì)算過程如下: (1)u是從原點(diǎn)指向頂點(diǎn)的單位向量(在視覺坐標(biāo)中); (2)n是當(dāng)
58、前法線向量,在變換為視覺坐標(biāo)之后; (3)r是反射向量(x,y,z),它是通過u-2nnu這個(gè)公式計(jì)算的。(4)中間值是通過下面這個(gè)公式來進(jìn)行計(jì)算的:(5)最后,可以使用下面這個(gè)公式來計(jì)算s和t紋理坐標(biāo)加上12的原因是為了使s,t坐標(biāo)的值處于(00,10)范圍內(nèi)。此天空完成后的大體模型如下所示: 圖 4-1 場(chǎng)景中的天空4.2地面4.2.1地面的生成地面模型的生成有很多的方法,究其本質(zhì)都是產(chǎn)生網(wǎng)格模型,網(wǎng)格模型都是由一些平面的塊組成的,每個(gè)塊都應(yīng)用不同的紋理,這樣每個(gè)塊只有一個(gè)單獨(dú)的法向量,但擁有其自己的紋理坐標(biāo),所以,在地面的繪制過程中,每個(gè)塊的數(shù)據(jù)可以像類似下面這樣:1)塊頂點(diǎn)的數(shù)量;2)
59、塊法向的索引;3)頂點(diǎn)索引的列表;4)紋理坐標(biāo)索引的列表;下面介紹幾種不同的經(jīng)常使用的地形的構(gòu)成方法:(1)高程地形 高程地形是指由高程?hào)鸥窠M成的地表或地形系統(tǒng)。當(dāng)在屏幕上將所有的這些高度值都繪制完成之后,就會(huì)得到一個(gè)代表著場(chǎng)景地形的網(wǎng)格。本文中的地面本身是被一個(gè)表示草地的簡單紋理所映射,同時(shí)使用了一些水的紋理來增強(qiáng)場(chǎng)景的真實(shí)感。 在實(shí)際使用中,我們可以將一個(gè)256*256的灰度圖載入到內(nèi)存中,其圖中的每一位像素值表示高程中的一個(gè)柵格位置,由此而確定每一個(gè)柵格位置處的高度。可以用上述灰度圖中的每一位的顏色值來指定每一個(gè)柵格的高度。在將所有柵格值載入內(nèi)存中之后,就會(huì)得到以指定間隔表示地形高度的一
60、組數(shù)據(jù)點(diǎn),為了設(shè)置每個(gè)高度頂點(diǎn)之間的間隔或者距離,需要使用所謂的圖尺度比例,如果要增加每個(gè)高度數(shù)據(jù)點(diǎn)彼此之間的間隔,只需增大圖尺度比例因子的值即可。 在為每個(gè)柵格位置指定頂點(diǎn)坐標(biāo)時(shí),需要基于正在設(shè)置的坐標(biāo)分量而將其柵格位置索引與圖尺度比例因子相乘,例如,當(dāng)定義了一個(gè)頂點(diǎn)的x軸坐標(biāo)分量時(shí),就要先取得其沿軸的柵格位置并將其與尺度比例因子相乘。由于地形圖其實(shí)就是由高度值組成的柵格,那么可以創(chuàng)建一個(gè)二維頂點(diǎn)坐標(biāo)陣列,柵格將沿著x軸和z軸分布,而y軸則代表地形的高度。 為了繪制地形圖,我們需要對(duì)于沿z軸方向的每一行柵格值使用GL_TRIANGLE_ATRIP。由于我們將使用這種方法繪制地形,所以必須以一
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度人工智能產(chǎn)業(yè)投資轉(zhuǎn)借款合作協(xié)議模板3篇
- 國防建設(shè)知識(shí)
- 二零二五年度個(gè)人知識(shí)產(chǎn)權(quán)侵權(quán)糾紛授權(quán)委托書3篇
- 二零二五年度商場(chǎng)消防安全責(zé)任協(xié)議書3篇
- 二零二五年度城市停車場(chǎng)信息化建設(shè)承包協(xié)議3篇
- 二零二五年辦公樓智能安防與保潔服務(wù)合同3篇
- 二零二五版海洋石油鉆井平臺(tái)外派海員聘用合同范本3篇
- 二零二五年度商品房團(tuán)購項(xiàng)目合作代理協(xié)議3篇
- 二零二五年度高校研究生學(xué)術(shù)交流活動(dòng)合作協(xié)議3篇
- 藝術(shù)地坪施工方案
- 衛(wèi)生健康系統(tǒng)安全生產(chǎn)隱患全面排查
- 媒介社會(huì)學(xué)備課
- GB/T 15114-2023鋁合金壓鑄件
- 三相分離器原理及操作
- 新教科版五年級(jí)下冊(cè)科學(xué)全冊(cè)每節(jié)課后練習(xí)+答案(共28份)
- 貨物驗(yàn)收單表格模板
- 葫蘆島尚楚環(huán)??萍加邢薰踞t(yī)療廢物集中處置項(xiàng)目環(huán)評(píng)報(bào)告
- 600字A4標(biāo)準(zhǔn)作文紙
- GB/T 18015.2-2007數(shù)字通信用對(duì)絞或星絞多芯對(duì)稱電纜第2部分:水平層布線電纜分規(guī)范
- 2007年邁騰3.2發(fā)動(dòng)機(jī)維修手冊(cè)
- 選擇性必修二課本活動(dòng)題答案(教參) 高中地理湘教版(2019)選擇性必修二
評(píng)論
0/150
提交評(píng)論