版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、飛行姿態(tài)的三維動態(tài)實時顯示摘要三維視景仿真是虛擬現(xiàn)實領(lǐng)域的主要研究課題,它能利用計算機(jī)為人們建立一個逼真度和可信度都較高的虛擬場景,在當(dāng)前很多領(lǐng)域中都有了廣泛的應(yīng)用,包括交互式的游戲娛樂、大型的工程漫游、城市規(guī)劃等。尤其是在軍事方面關(guān)于武器研制和飛行器試驗中,通過該手段可以獲取豐富的仿真數(shù)據(jù),是一種經(jīng)濟(jì)方便的可視化分析和研究的方法。本文基于OpenGL,應(yīng)用Visual C+ 6.0 平臺,用C+編程對飛行器的飛行場景進(jìn)行了設(shè)計與仿真這樣做的目的是由于在實際操縱中,使用真實的飛機(jī)來訓(xùn)練新操作手的風(fēng)險和代價是很高的,所以,在實驗室中使用模擬訓(xùn)練器來訓(xùn)練是國內(nèi)外通常采用的有效方法。文章使用紋理貼圖
2、的方法實現(xiàn)了對天空和地面的模擬,用多邊形組成了飛機(jī),使用鍵盤來實現(xiàn)對飛機(jī)的操作,同時添加了霧以及光照來增加場景的真實感。程序的運(yùn)行結(jié)果比較符合預(yù)期要求,對實際操縱有一定的借鑒意義。此外也可用于三維游戲設(shè)計及其他領(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 實時性 PAGEREF _Toc390693415 h 4 HYPERLINK l _Toc390693416 2.1實時性 PAGERE
9、F _Toc390693416 h 4 HYPERLINK l _Toc390693417 2.2實時性的重要性 PAGEREF _Toc390693417 h 4 HYPERLINK l _Toc390693418 2.3實時性的實現(xiàn) PAGEREF _Toc390693418 h 4 HYPERLINK l _Toc390693419 2.3.1顯示列表的優(yōu)勢 PAGEREF _Toc390693419 h 5 HYPERLINK l _Toc390693420 2.3.2顯示列表的適用場合 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 三維模型操作及場景繪制原理 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 場景的構(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場景中的光照 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場景中的霧 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è)計(論文)知識產(chǎn)權(quán)聲明 PAGEREF _Toc390693460 h 39 HYPERLINK l _Toc390693461 畢業(yè)設(shè)計(論文)獨(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é)計算可視化是2 0 世紀(jì)
19、80 年代后期隨著計算機(jī)圖形學(xué)應(yīng)用的拓廣而發(fā)展起來的一個新的研究分支, 受其推動, 各種信息的可視化成為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)實的途徑。怎樣把海底地貌地形通過計算機(jī)形象地、直觀地顯示出來, 實現(xiàn)飛行器場景的逼真顯現(xiàn), 就是本系統(tǒng)的研究目的。目前,
20、 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)(如Windows 系列、OS/2 等)下運(yùn)行。經(jīng)過近幾年來的發(fā)展, 虛擬現(xiàn)實技術(shù)及設(shè)備被很多領(lǐng)域應(yīng)用, 而飛行仿真是最重要的應(yīng)用領(lǐng)域之一。 Open-GL是SGI公司開發(fā)的與硬件環(huán)境和操作系統(tǒng)獨(dú)立的API,它提供了建模、坐標(biāo)變換、著色、光照、平滑等二維和三維圖形功能
21、以及紋理映射、曲線等高級功能,并且能夠生成三維場景,繪制三維物體Open-GL良好的交互性和代碼運(yùn)行的高效性使它已經(jīng)成為三維動畫和虛擬現(xiàn)實場景開發(fā)的重要工具。OpenGL的根本目的是為硬件加速的3D繪制而設(shè)計的,為程序員提供了一個圖形硬件接口。同時一個功能強(qiáng)大的,支持底層繪制和造型能力的軟件圖形函數(shù)庫,適用于所有的主流操作系統(tǒng)平臺,有著廣泛的硬件支持。是為游戲,造型以及CAD之類的圖形應(yīng)用程序而設(shè)計的。它有意識的只提供底層的繪制程序功能,這就使得程序員有了更多的控制權(quán)和靈活性。而使用這些程序可以很容易的創(chuàng)建高層的繪制和造型函數(shù)庫。 OpenGL是幾百個能夠訪問圖形硬件所有性能的函數(shù)的集合。在其
22、內(nèi)部,它是以狀態(tài)機(jī)的形式運(yùn)行的,就是一些狀態(tài)的集合,而這些狀態(tài)決定了OpenGL如何運(yùn)行。通過應(yīng)用程序編程接口,可以設(shè)置狀態(tài)機(jī)的各個狀態(tài),例如當(dāng)前的顏色,光照以及混合模式等狀態(tài)。在繪制時,狀態(tài)機(jī)的當(dāng)前設(shè)置決定了每一個將被顯示的對象如何被繪制。準(zhǔn)確的掌握各種狀態(tài)機(jī)的含義以及他們所產(chǎn)生的效果是很重要的,因為一個或者多個不正確的狀態(tài)基于OpenGL三維飛行器程序設(shè)計與仿真態(tài)設(shè)置,就會導(dǎo)致意想不到的結(jié)果。在Windows操作系統(tǒng)中,OpenGL可以完全替代圖形設(shè)備接口,圖形設(shè)計接口的設(shè)計使得對于Windows程序員來說圖形硬件是完全不可見的,它提供了抽象層從而避免了程序員處理與硬件相關(guān)的問題。但是圖形
23、設(shè)備接口是為一般的應(yīng)用程序而提供的,因此不能滿足游戲所必須的速度要求。OpenGL允許完全繞過GDI,直接和圖形硬件打交道。 OpenGL實用庫(GLU)是OpenGL的補(bǔ)充,它提供了更高一層的函數(shù),GLU的功能廣泛,既有OpenGL函數(shù)的簡單封裝,也有能支持高級的繪制技術(shù)的復(fù)雜組件。OpenGL 提供了功能強(qiáng)大的圖元繪制命令, 所有高級的目標(biāo)繪制都通過這些命令來實現(xiàn), 它共包括 100 多個功能強(qiáng)大的圖形函數(shù), 分屬于三個基本的圖形庫: 基礎(chǔ)核心庫( g l-) 、應(yīng)用程序庫( Glu-) 和編程輔助庫( GLAUX-) 。在Visual C+ + 編程環(huán)境下, 能方便地調(diào)用這些函數(shù)對三維圖
24、形進(jìn)行仿真。1.2國內(nèi)外相關(guān)研究情況飛行器仿真是可視化仿真技術(shù)的一個重要分支,是航空航天技術(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)研究成果,盡可能的掌握相關(guān)的先進(jìn)軟件,在此基礎(chǔ)上進(jìn)行創(chuàng)新研究,盡量縮短差距,推動國內(nèi)可
25、視化仿真技術(shù)的創(chuàng)新和長足發(fā)展。1.3本文研究的目的及主要內(nèi)容由于計算機(jī)軟硬技術(shù)水平的限制,科學(xué)計算在早起只能以批處理方式實現(xiàn),而不能進(jìn)行交互處理,對于大量的輸出數(shù)據(jù),只能人工方式處理,或者用繪圖工具輸出二維圖形,這種處理方式不僅效率低下,而且丟失大量的信息。近年來,隨著計算機(jī)的普及和科學(xué)技術(shù)的迅速發(fā)展,天氣,衛(wèi)星以及地震勘測領(lǐng)域中的數(shù)據(jù)量越來越大,可視化技術(shù)就成為科學(xué)研究中必不可少的手段。在航空航天領(lǐng)域,可視化與仿真技術(shù)的結(jié)合飛行器可視化仿真的技術(shù)應(yīng)用越來越廣泛,作用越來越突出。在航天任務(wù)選擇階段,研究人員需要進(jìn)行大量的軌道計算,而在航天發(fā)射和航天任務(wù)的執(zhí)行過程中,需要對航天工具以及航天器進(jìn)行
26、導(dǎo)航,定位,上述工作中,都會產(chǎn)生大量的有關(guān)飛行狀態(tài)的數(shù)據(jù),將這些抽象的數(shù)據(jù)在屏幕上表現(xiàn)出來,對航天任務(wù)的分析和論證,以及發(fā)射和運(yùn)行方案的選擇,都是極其重要的??梢暬抡娴难芯恳饬x主要有以下幾點(diǎn):大大加快飛行數(shù)據(jù)的處理速度,使通過仿真計算或測量得到的龐大數(shù)據(jù)得到有效的利用,實現(xiàn)人和人與機(jī)之間的圖像通訊,而不是目前的圖像和數(shù)據(jù)通訊,從而使系統(tǒng)工作人員觀察到傳統(tǒng)方法難以觀察到的包含在飛行數(shù)據(jù)中的現(xiàn)象和規(guī)律使系統(tǒng)人員不僅能得到計算結(jié)果,而且知道在計算過程中發(fā)生了什么情況,并可主動改變參數(shù),觀察其影響,對計算結(jié)果進(jìn)行引導(dǎo)和控制,進(jìn)而對運(yùn)行和控制方案進(jìn)行選擇。本文的主要研究內(nèi)容在于飛行器的空間運(yùn)動軌跡建模
27、以及在三維可視化環(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)用仿真數(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)生真實感,最后將制作飛行器,該飛行器是由基本的圖形組
28、合而成的,最后根據(jù)運(yùn)動軌跡方程實時計算出飛機(jī)的飛行位置,對運(yùn)動模型進(jìn)行實時繪制。2實時性本章首先對實時性的概念、重要性、實現(xiàn)方法進(jìn)行闡述,在此基礎(chǔ)上著重研究了飛行模擬中需要采用的實現(xiàn)實時性的方法。2.1實時性簡單一個字理解就是快,能達(dá)到所需要的“快”就是實時了。實時系統(tǒng)不僅僅是表現(xiàn)在“快”上,而更主要的是實時系統(tǒng)必須對外來事件在限定時間內(nèi)做出反應(yīng),當(dāng)然這個限定時間的范圍是根據(jù)實際需要來定的,例如控制化學(xué)反應(yīng)過程的時間可能很長,而飛行控制系統(tǒng)的這個時間就會很短。2.2實時性的重要性無論是在工程應(yīng)用控制,飛行仿真研究,三維設(shè)計顯示及網(wǎng)絡(luò)通信等等,諸多領(lǐng)域中對實時性都有著非常高的要求。工程控制中通常
29、要求在指令發(fā)出后的很短時間內(nèi)系統(tǒng)做出響應(yīng),在不同的場合需要達(dá)到ns級、s級。飛行仿真中要求及時精準(zhǔn),這樣才能得到更有價值的仿真數(shù)據(jù)。網(wǎng)絡(luò)通信中,誰也不希望自己指令發(fā)出后,滯后一段時間才得到信息。三維顯示中如果不能實現(xiàn)實時性,人們看到的結(jié)果往往是閃爍的畫面,具有實時性才能看到平滑具有真實感的動態(tài)場景。本文中就要求飛行器顯示的結(jié)果具有實時性。2.3實時性的實現(xiàn)飛行過程就是模型進(jìn)行大量重繪的過程,如果每次都要讀取模型數(shù)據(jù)無疑會帶來很大的系統(tǒng)開銷,而且效率緩慢,響應(yīng)速度也會很低,這樣得到的結(jié)果明顯是有很大的瑕疵,不能得到飛行場景的真實性。所以這里主要是引入一個在飛行器構(gòu)建過程中特別重要的知識,就是顯示
30、列表的概念。由于OpenGL顯示列表(Display List)是由一組預(yù)先存儲起來的留待以后調(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)容。2.3.1顯示列表的優(yōu)勢OpenGL顯示列表的設(shè)計能優(yōu)化程序運(yùn)行性能,尤其是網(wǎng)絡(luò)性能。它被設(shè)計成命令高速緩存,而不是動態(tài)數(shù)據(jù)庫緩存。也就是說,一旦建立了顯示列表,就不能修改它。因為若顯示列表可以被修改,則
31、顯示列表的搜索、內(nèi)存管理的執(zhí)行等開銷會降低性能。采用顯示列表方式繪圖一般要比瞬時方式快,尤其是顯示列表方式可以大量地提高網(wǎng)絡(luò)性能,即當(dāng)通過網(wǎng)絡(luò)發(fā)出繪圖命令時,由于顯示列表駐留在服務(wù)器中,因而使網(wǎng)絡(luò)的負(fù)擔(dān)減輕到最小。另外,在單用戶的機(jī)器上,顯示列表同樣可以提高效率。因為一旦顯示列表被處理成適合于圖形硬件的格式,則不同的OpenGL實現(xiàn)對命令的優(yōu)化程度也不同。例如旋轉(zhuǎn)矩陣函數(shù)glRotate*(),若將它置于顯示列表中,則可大大提高性能。因為旋轉(zhuǎn)矩陣的計算并不簡單,包含有平方、三角函數(shù)等復(fù)雜運(yùn)算,而在顯示列表中,它只被存儲為最終的旋轉(zhuǎn)矩陣,于是執(zhí)行起來如同硬件執(zhí)行函數(shù)glMultMatrix()一
32、樣快。一般來說,顯示列表能將許多相鄰的矩陣變換結(jié)合成單個的矩陣乘法,從而加快速度。2.3.2顯示列表的適用場合并不是只要調(diào)用顯示列表就能優(yōu)化程序性能。因為調(diào)用顯示列表本身時程序也有一些開銷,若一個顯示列表太小,這個開銷將超過顯示列表的優(yōu)越性。下面給出顯示列表能最大優(yōu)化的場合:矩陣操作大部分矩陣操作需要OpenGL計算逆矩陣,矩陣及其逆矩陣都可以保存在顯示列表中。光柵位圖和圖像程序定義的光柵數(shù)據(jù)不一定是適合硬件處理的理想格式。當(dāng)編譯組織一個顯列表時,OpenGL可能把數(shù)據(jù)轉(zhuǎn)換成硬件能夠接受的數(shù)據(jù),這可以有效地提高畫位圖的速度。光、材質(zhì)和光照模型當(dāng)用一個比較復(fù)雜的光照環(huán)境繪制場景時,可以為場景中的
33、每個物體改變材質(zhì)。但是材質(zhì)計算較多,因此設(shè)置材質(zhì)可能比較慢。若把材質(zhì)定義放在顯示列表中,則每次改換材質(zhì)時就不必重新計算了。因為計算結(jié)果存儲在表中,因此能更快地繪制光照場景。紋理因為硬件的紋理格式可能與OpenGL格式不一致,若把紋理定義放在顯示列表中,則在編譯顯示列表時就能對格式進(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、個顯示列表的開始,其后的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_AND_EXECUTE。void glEndList(void);標(biāo)志顯示列表的結(jié)束。2.3.4執(zhí)行顯示列表在建立顯示列表以后就可以調(diào)用執(zhí)行顯示列表的函數(shù)來執(zhí)行它,并且允許在程序中多次執(zhí)行同一顯示列表,同時也可以與其它函數(shù)的瞬時方式混合
35、使用。顯示列表執(zhí)行的函數(shù)形式如下:void glCallList(GLuint list);執(zhí)行顯示列表。參數(shù)list指定被執(zhí)行的顯示列表。顯示列表中的函數(shù)語句按它們被存放的順序依次執(zhí)行;若list沒有定義,則不會產(chǎn)生任何事情。2.3.5管理顯示列表在上一節(jié)例子中,我們使用了一個正整數(shù)作為顯示列表的索引。但是在實際應(yīng)用中,一般不采用這種方式,尤其在創(chuàng)建多個顯示列表的情況下。如果這樣做,則有可能選用某個正在被占用的索引,并且覆蓋這個已經(jīng)存在的顯示列表,對程序運(yùn)行造成危害。為了避免意外刪除,可以調(diào)用函數(shù)glGenList()來產(chǎn)生一個沒有用過的顯示列表,或調(diào)用glIsList()來決定是否指定的顯
36、示列表被占用。此外,在管理顯示列表的過程中,還可調(diào)用函數(shù)glDeleteLists()來刪除一個或一個范圍內(nèi)的顯示列表。下面分別介紹這些函數(shù):GLuint glGenList(GLsizei range);分配range個相鄰的未被占用的顯示列表索引。這個函數(shù)返回的是一個正整數(shù)索引值,它是一組連續(xù)空索引的第一個值。返回的索引都標(biāo)志為空且已被占用,以后再調(diào)用這個函數(shù)時不再返回這些索引。若申請索引的指定數(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個顯示列表,并且刪除后的這些索引重新有效。若刪除一個沒有建立的顯示列表則忽略刪除操作。當(dāng)建立一個與已經(jīng)存在的顯示列表索引相同的顯示列表時,OpenGL將自動刪除舊表。3 三維模型操作及場景繪制原理3.1基本框架3.1.1構(gòu)建應(yīng)用程序框架應(yīng)用Visual C+ 6.0 建立一個基于MFC 的應(yīng)用程序框架, 并將VC 庫文件 opengl32.lib、glu32.lib 和glaux.lib包含在應(yīng)用程序中。同時還要修改工程
38、中的相關(guān)參數(shù), 即將_CONLOLE改為_WINDOWS, 在link項,在對象、模塊欄的前面加上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,它只需要一個句柄就可以任意調(diào)用OpenGL 函數(shù), 而其他DC調(diào)用每個GDI 函數(shù)時都需要一個句柄。使用時先通過wglCreateContext () 函數(shù)創(chuàng)建一個RC,然后調(diào)用wglMakeCurrent() 函數(shù)啟動它, 就可在所定義的窗口內(nèi)調(diào)用OpenGL函數(shù)繪制飛行器了。3.1.3設(shè)置像素格式像素格式是對Win32 API的另一種擴(kuò)展,它指定了設(shè)備的繪圖屬性, 包括繪圖界面的顏色表示模式、顏色位
40、數(shù)、累積緩存區(qū)、深度緩存區(qū)和模板緩存區(qū)的位數(shù)。每個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ù)會為設(shè)備描述表選擇像素格式, 最后調(diào)用SetPixelFormat()將其設(shè)置為當(dāng)前像素格式。3.2坐標(biāo)變換變換允許我們移動,旋轉(zhuǎn)和操作3D世界中的實體。在介紹其他坐標(biāo)變換之前,先說 Ope
41、nGL中兩個基本的變換,這兩個變換在其他變換中起著重要的作用,是其他的變換的基礎(chǔ)。為了進(jìn)行變換,基本就是用變換矩陣乘以想要變換的點(diǎn),得到的結(jié)果就是變換過的新的點(diǎn),比如有一個點(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中的平移:要對一個點(diǎn)進(jìn)行平移變換,只需要將每個坐標(biāo)軸的增量值加上要平移的點(diǎn)的原始坐標(biāo)就行了。也就是一系列點(diǎn)和矩陣相乘的操作:例如: 有個平移矩陣:如果要用這個矩陣平移一個點(diǎn),只要用這個矩陣乘以這個點(diǎn)的矢量矩陣,就像下面這樣:在本文中,飛機(jī)在沒
42、有任何操作的情況下一直沿z軸飛行,這個操作過程調(diào)用的是OpenGL中的gltranslate()函數(shù),它的內(nèi)部就封裝了上述的處理過程,對飛機(jī)模型所處的位置進(jìn)行上述變換,使得飛機(jī)一直向前飛行;接下來說旋轉(zhuǎn)變換:旋轉(zhuǎn)變換主要運(yùn)用了三角學(xué),而且關(guān)于每個坐標(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軸值不變:如果要讓一個點(diǎn)繞某一坐標(biāo)軸旋轉(zhuǎn),就用此坐標(biāo)軸的旋轉(zhuǎn)矩陣乘以這個點(diǎn),例如,講一個點(diǎn)繞z軸旋轉(zhuǎn),就像下面這樣:然后用這個點(diǎn)去和Z軸的變
43、換矩陣相乘,即得到這一點(diǎn)旋轉(zhuǎn)后的結(jié)果:在飛機(jī)左右旋轉(zhuǎn)或者滾降的過程中,飛機(jī)所在位置都是圍繞Y軸或者X軸在旋轉(zhuǎn),雖然可以直接調(diào)用OpenGL中的glrotate()函數(shù),但這個函數(shù)內(nèi)部的計算過程全部類似于上面的處理過程。定義了頂點(diǎn)以后,但在屏幕上顯示他們之前一共會發(fā)生3中類型的變換:視圖變換,模型變換和投影變換。其中一些關(guān)鍵名詞的意思如下:視圖:指定觀察者或照相機(jī)的位置;模型:在場景中移動物體;模型視圖:描述視圖和模型變換的對偶性;投影:改變可視區(qū)域的大小或者重新設(shè)置它的形狀;視口:這是一種偽變換,只是對窗口上的最終輸出進(jìn)行縮放;視覺坐標(biāo)是進(jìn)行變換的一個非常重要的概念,它是根據(jù)觀察者的角度而言的
44、,與可能發(fā)生的變換無關(guān),我們可以把它看成是“絕對的”屏幕坐標(biāo)。因此,視覺坐標(biāo)表示一種固定的坐標(biāo)系統(tǒng)。3.2.1視圖變換視圖變換是場景所應(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)放在自己所希望的任何位置,并允許在任何方向上觀察場景。確定視圖變換就像是在場景中放置照相機(jī)病讓他指向某個方向。作為總體原則,在進(jìn)行任何變換之前必須先指定視圖變換。原因是視圖變換的效果相當(dāng)于根據(jù)視覺坐標(biāo)系統(tǒng)移動當(dāng)
45、前所使用的坐標(biāo)系統(tǒng)。然后,根據(jù)最新修改的坐標(biāo)系統(tǒng)進(jìn)行其他所有的后續(xù)變換。從本質(zhì)上說,它只是在繪制物體之前應(yīng)用到一個虛擬物體之上的一種模型變換。3.2.2模型變換模型變換用于對模型以及模型內(nèi)部的特定物體進(jìn)行操縱。它可以移動物體,對它們進(jìn)行旋轉(zhuǎn),或者對它們進(jìn)行縮放。場景或者物體的最終外觀很大程度上取決于模型變換的應(yīng)用順序。對于移動和旋轉(zhuǎn),情況更是如此。3.2.3投影變換投影變換是在模型視圖變換之后應(yīng)用到物體的頂點(diǎn)之上的。這種投影實際定義了可視區(qū)域,并建立裁剪平面。裁剪平面是3D空間的平面方程式,Open-GL用它來確定幾何圖形能否被觀察者所看到。更為具體的說,投影變換制訂了一個完成的場景(在所有的
46、模型變換都已經(jīng)完成之后)投影到屏幕上的最終圖像,它主要包括正投影以及透視投影,在本文中主要利用透視投影。在正投影中,屏幕上所繪制的所有多邊形都按照指定的相對大小出現(xiàn)。直線和多邊形使用平行線直接映射到2D屏幕上。這意味著不管物體有多遠(yuǎn),都仍然按照相同的大小進(jìn)行繪制,平面的出現(xiàn)屏幕上。這種類型的頭型通常用于渲染二維圖像和二維圖形。透視投影所顯示的場景更接近真實,他的標(biāo)志性特點(diǎn)就是透視縮短,他會使遠(yuǎn)處的物體看上去比相同大小的近處物體更小一些。3D空間中平行的直線在觀察者眼里并不總是平行的。透視投影的優(yōu)點(diǎn)是不必判斷直線將在什么地方交匯,也不必操心遠(yuǎn)處的物體是如何變小的。我們所需要做的就是用模型視圖變換
47、指定場景,然后應(yīng)用透視視圖。3.2.4視區(qū)變換視口變換:當(dāng)上面的操作全部完成以后,最后所獲得的是場景的而為投影,將被投影到屏幕上的某個窗口。這種到窗口坐標(biāo)的映射是最后一個完成的變換,成為視口變換。通常,顏色緩沖區(qū)和窗口像素之間存在著一對一的對應(yīng)關(guān)系。3.3紋理映射3.3.1紋理究其本質(zhì),紋理就是有些圖案,其范圍可能包括了從條紋和簡單的形狀到自然圖案,可以是程序員自己生成的,也可以是現(xiàn)成的圖片。也可以說,紋理就是一個函數(shù)textture(s,t),對于s和t在0到1之間的取值產(chǎn)生一個顏色或者亮度值。在本文的仿真中,紋理圖案使用的是現(xiàn)成的圖片。紋理可以是2D,3D,4D紋理等,但我們文中使用的是2
48、D紋理,它通常是從圖像或者圖片文件中載入的,文中使用的是從一幅256*256的現(xiàn)成圖片中載入紋理數(shù)據(jù),它是在程序運(yùn)行是才生成紋理。 當(dāng)我們將一個紋理映射應(yīng)用到表面時,需要一種方式來定義其紋理在表面的方向,為此,我們使用所謂的參數(shù)坐標(biāo),其定義為(s,t)對于常規(guī)的紋理映射來說,s,t的值處于數(shù)值0到1之間,就是(0,1)。對于所要進(jìn)行紋理映射的表面,其上的坐標(biāo)的最大值和最小值決定了紋理映射的范圍,改變這些值就可以產(chǎn)生各種不同的紋理映射效果。3.3.2紋理數(shù)據(jù)紋理數(shù)據(jù)在本次仿真設(shè)計中占有很重要的位置,紋理數(shù)據(jù)包括圖像的數(shù)據(jù)以及紋理如何應(yīng)用到具體的模型上去,這就涉及一個紋理坐標(biāo)的問題。草地,天空,飛
49、行器都使用紋理貼圖來增加圖形的真實感。紋理數(shù)據(jù)主要指的是圖像載入內(nèi)存時生成的數(shù)據(jù),它存儲在一個數(shù)組中,數(shù)組的專業(yè)名字稱為紋理對象,其中,圖像的數(shù)據(jù)主要通過以下程序段載入內(nèi)存而獲得的:最后在上面的工作完成后,由于位圖的顏色格式為BGR,因此還必須交換R和B的值,以得到RGB數(shù)據(jù)。在將紋理數(shù)據(jù)從BMP文件中載入到內(nèi)存之后,將其定義為一個OpenGL紋理圖,調(diào)用OpenGL中的glTexImage()函數(shù)可以實現(xiàn),在函數(shù)被調(diào)用之后,紋理數(shù)據(jù)就會被載入并做好被使用的準(zhǔn)備,調(diào)用glGenTexture()函數(shù)將一個名字賦給紋理對象,因為紋理對象是用來存儲數(shù)據(jù)的,使其隨時準(zhǔn)備被使用。有了紋理對象,就可以將
50、多個紋理一次性的載入內(nèi)存,以便場景繪制期間隨時引用其中的任何一個紋理。生成紋理名之后,然后使用glBindTexture()函數(shù)將此紋理對象綁定為我們將在繪制多邊形時使用的當(dāng)前紋理。如果想要使用多個紋理對象,那么每次要使用不同的紋理時都要調(diào)用glBindTexture()函數(shù)來綁定相應(yīng)的紋理對象。最后當(dāng)紋理對象被綁定到其數(shù)據(jù)上以后,可以調(diào)用glBindTexture()函數(shù)來將此紋理設(shè)置為當(dāng)前的紋理狀態(tài),這樣在繪制多邊形完成后,就可以調(diào)用相應(yīng)的紋理來進(jìn)行貼圖。3.4漫游的原理在飛行器仿真中,飛行器可以在三維場景中漫游,隨著我們的移動,我們周圍的景物也在發(fā)生變化,在OpenGL中,物體坐標(biāo)的移動
51、可視為物體的移動,角度的變換,可仿真視角的效果,在行走過程中,視覺的效果在OpenGL中被模擬出來。在人對世界的綜合視覺觀察效果,是來源于我們的眼睛。眼睛就像一架照相機(jī),將外部映像反映到我們的大腦。在計算機(jī)3D圖形處理技術(shù)中,也有類似我們眼睛的東西glulookAt()觀察函數(shù),如果這個觀察點(diǎn)在Open-GL場景中的位置發(fā)生變化,我們在計算機(jī)屏幕上的圖像就發(fā)生了變化。它的基本原理是:我們在計算機(jī)屏幕上觀看圖形時,我們的觀察點(diǎn)默認(rèn)為(0,0,0),也就是為什么我們總是要把圖形的Z坐標(biāo)設(shè)為小雨0的原因(Z大于0時圖形在屏幕外面的)。在Open-GL中觀察虛擬世界的主要函數(shù)glulookAt(),它
52、的主要作用是可以改變我們在場景中的觀察點(diǎn),看到前面的場景越來越近,兩邊的物體在向后退,這就是我們的觀察點(diǎn)在場景中的位置改變的結(jié)果。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表示我們的頭始終是正立的。因為glLookAt()函數(shù)在本文飛機(jī)的漫游過程中比較重要,所以下面利用圖示的方法介紹一下gl
53、lookat()函數(shù)的工作過程:glLookAt()函數(shù)中的三個主要變量(eye,look,up)就是像上面展示的那樣,當(dāng)我們把eye,look,up三個參數(shù)傳遞給glLookAt()函數(shù)的時候,函數(shù)可以自身算出新的坐標(biāo)系,也就相當(dāng)于將我們?nèi)说难劬υ趫鼍爸幸频搅硪粋€位置,因此漫游的過程也就是視點(diǎn)的變化過程,也即坐標(biāo)系不斷改變的過程。 但是,glLookAt()是如何計算坐標(biāo)系的三個坐標(biāo)向量呢?首先,對于Z軸可以從圖中得知,它等于look-eye,因此Z=look-eye;Y軸和X軸它們兩個都垂直于Z軸,X明顯的垂直于up向量,因為up向量一般情況下都是沿Y軸向上的,這個向量規(guī)定了我們視點(diǎn)向上的
54、方向,因此可以得知X軸垂直于up和Z的叉積;當(dāng)X軸計算出來以后,剩下的就是Y軸向量,它必須垂直于X軸和Z軸,也就是等于X軸和Z軸分量的叉積,得出這幾個坐標(biāo)軸分量的向量以后,就可以重新構(gòu)建坐標(biāo)系,也就是可以實現(xiàn)視點(diǎn)的移動,這就是glLookAt()可以實現(xiàn)視點(diǎn)移動的原理3.5屏幕顯示在OpenGL中,三維圖形最終要顯示在屏幕上,而屏幕是一個二維平面,在這個將三維圖形變成二維圖形時要經(jīng)歷以下過程:這中間涉及的一些知識將在上面已經(jīng)詳細(xì)介紹,這里主要是了解計算機(jī)顯示三維場景的大致流程,其中主要涉及上述的三種變換:視圖變換,模型變換以及投影變換。4 場景的構(gòu)建在本文中,對于飛行器的仿真,場景構(gòu)建可謂是重
55、中之重,構(gòu)建出好的模型對于仿真的真實性以及實效性都有很大的幫助,場景的構(gòu)建大的方面主要涉及飛機(jī)的構(gòu)建,天空的構(gòu)建,地面的生成,以及像光照,霧等效果的實現(xiàn),下面就依次來講述文中各個模型是如何生成的。4.1天空的構(gòu)建天空是飛行器場景中必不可少的一部分,天空模型也有許多的生成方法,下面介紹兩種常用的方法:(1)天空盒天空盒的原理是繪制一個巨大的矩形盒子,然后在每個盒子的表面貼上天空紋理的圖片,所謂的天空盒就是用一矩形方盒作為天空遠(yuǎn)景貼圖的載體。構(gòu)成天空盒的載體是一個長方體,在它的前后左右上5個面貼有天空遠(yuǎn)景的五幅圖片,這五幅圖片必須有一個規(guī)律,即就是:1).圖形為BMP位圖格式,尺寸(像素點(diǎn))為2的
56、N次方(32,64);2).頂圖的4邊與前后左右圖的上邊相連;3).前后左右的4幅圖必須首尾相連;在編程的時候,按順序標(biāo)記紋理坐標(biāo)就可以構(gòu)造出所謂的天空盒,以此來模擬真實的天空。下圖便是繪制成型的天空盒。(2)球形天空在本文中,天空主要是繪制一個球,其他場景都包含在這個球內(nèi)。由于地球是球型的,所以天空像半個球一樣籠罩在大地之上。在用計算機(jī)仿真3D天空時,半球型天空模型顯然符合真實世界的天空模型。繪制球體時我們調(diào)用了OpenGL中的繪制球體函數(shù)。在本文中,這個實現(xiàn)過程如下:gluSphere(quadratic,MAX*50,20,20);這個球的半徑是MAX*50,設(shè)置的參數(shù)盡量大是因為要完全
57、包括其他場景中的模型,另外兩個參數(shù)20是指兩個20定義了球圍繞和沿著z軸應(yīng)細(xì)分的份數(shù),分別類似于地球的經(jīng)線和緯線;天空繪制完成以后,給球體貼上天空的紋理,就構(gòu)造出真實的天空場景。在為天空貼紋理圖時,需要知道紋理坐標(biāo),在OpenGL中需要調(diào)用環(huán)境紋理貼圖算法,這個算法在球體表面上找到一個與被渲染的物體上的點(diǎn)具有相同正切面的點(diǎn),并且把球體上的這個點(diǎn)的顏色繪制成那個物體上對應(yīng)的點(diǎn)的顏色。在自動生成紋理時可以調(diào)用:這些函數(shù),同時需要指定(s,t)坐標(biāo),這個生成坐標(biāo)的過程可以由GL_SPHERE_MAP紋理函數(shù)來完成,它的計算過程如下: (1)u是從原點(diǎn)指向頂點(diǎn)的單位向量(在視覺坐標(biāo)中); (2)n是當(dāng)
58、前法線向量,在變換為視覺坐標(biāo)之后; (3)r是反射向量(x,y,z),它是通過u-2nnu這個公式計算的。(4)中間值是通過下面這個公式來進(jìn)行計算的:(5)最后,可以使用下面這個公式來計算s和t紋理坐標(biāo)加上12的原因是為了使s,t坐標(biāo)的值處于(00,10)范圍內(nèi)。此天空完成后的大體模型如下所示: 圖 4-1 場景中的天空4.2地面4.2.1地面的生成地面模型的生成有很多的方法,究其本質(zhì)都是產(chǎn)生網(wǎng)格模型,網(wǎng)格模型都是由一些平面的塊組成的,每個塊都應(yīng)用不同的紋理,這樣每個塊只有一個單獨(dú)的法向量,但擁有其自己的紋理坐標(biāo),所以,在地面的繪制過程中,每個塊的數(shù)據(jù)可以像類似下面這樣:1)塊頂點(diǎn)的數(shù)量;2)
59、塊法向的索引;3)頂點(diǎn)索引的列表;4)紋理坐標(biāo)索引的列表;下面介紹幾種不同的經(jīng)常使用的地形的構(gòu)成方法:(1)高程地形 高程地形是指由高程柵格組成的地表或地形系統(tǒng)。當(dāng)在屏幕上將所有的這些高度值都繪制完成之后,就會得到一個代表著場景地形的網(wǎng)格。本文中的地面本身是被一個表示草地的簡單紋理所映射,同時使用了一些水的紋理來增強(qiáng)場景的真實感。 在實際使用中,我們可以將一個256*256的灰度圖載入到內(nèi)存中,其圖中的每一位像素值表示高程中的一個柵格位置,由此而確定每一個柵格位置處的高度。可以用上述灰度圖中的每一位的顏色值來指定每一個柵格的高度。在將所有柵格值載入內(nèi)存中之后,就會得到以指定間隔表示地形高度的一
60、組數(shù)據(jù)點(diǎn),為了設(shè)置每個高度頂點(diǎn)之間的間隔或者距離,需要使用所謂的圖尺度比例,如果要增加每個高度數(shù)據(jù)點(diǎn)彼此之間的間隔,只需增大圖尺度比例因子的值即可。 在為每個柵格位置指定頂點(diǎn)坐標(biāo)時,需要基于正在設(shè)置的坐標(biāo)分量而將其柵格位置索引與圖尺度比例因子相乘,例如,當(dāng)定義了一個頂點(diǎn)的x軸坐標(biāo)分量時,就要先取得其沿軸的柵格位置并將其與尺度比例因子相乘。由于地形圖其實就是由高度值組成的柵格,那么可以創(chuàng)建一個二維頂點(diǎn)坐標(biāo)陣列,柵格將沿著x軸和z軸分布,而y軸則代表地形的高度。 為了繪制地形圖,我們需要對于沿z軸方向的每一行柵格值使用GL_TRIANGLE_ATRIP。由于我們將使用這種方法繪制地形,所以必須以一
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版跨境電商供應(yīng)鏈金融服務(wù)合同3篇
- 2025版事業(yè)單位資產(chǎn)管理崗位轉(zhuǎn)正聘用合同3篇
- 2025年林地經(jīng)營權(quán)流轉(zhuǎn)合同范本2篇
- 2025年高校宿舍宿管員工作績效合同3篇
- 2025年度礦產(chǎn)資源代理注銷及勘探開發(fā)合同4篇
- 二零二四年度醫(yī)療器械貼牌研發(fā)與市場拓展合同3篇
- 2025年度儲油罐出租與能源審計合同4篇
- 2025年度智能調(diào)控鋁合金門窗系統(tǒng)開發(fā)與應(yīng)用合同4篇
- 個人咨詢合同書:專業(yè)服務(wù)費(fèi)用明細(xì)2024版
- 二零二四年度信用卡免息分期購物合同3篇
- 《阻燃材料與技術(shù)》-顏龍 習(xí)題解答
- 2024-2030年中國食品飲料灌裝設(shè)備行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 建筑結(jié)構(gòu)課程設(shè)計成果
- 纖維增強(qiáng)復(fù)合材料 單向增強(qiáng)材料Ⅰ型-Ⅱ 型混合層間斷裂韌性的測定 編制說明
- 習(xí)近平法治思想概論教學(xué)課件緒論
- 寵物會展策劃設(shè)計方案
- 孤殘兒童護(hù)理員(四級)試題
- 醫(yī)院急診醫(yī)學(xué)小講課課件:急診呼吸衰竭的處理
- 腸梗阻導(dǎo)管在臨床中的使用及護(hù)理課件
- 小學(xué)英語單詞匯總大全打印
- 衛(wèi)生健康系統(tǒng)安全生產(chǎn)隱患全面排查
評論
0/150
提交評論