計(jì)算機(jī)畢業(yè)論文--基于高度圖的三維地形生成技術(shù)研究_第1頁
已閱讀1頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)論文</b></p><p>  論文題目:基于高度圖的三維地形生成技術(shù)研究</p><p>  系 別:___ 計(jì)算機(jī)系_ _ _ _ _</p><p>  專業(yè)年級:_ _ __ _ </p><p>  學(xué) 號: _

2、___ ___ _ </p><p>  姓 名: ___ _ __ </p><p>  指導(dǎo)教師、職稱:__ </p><p>  年 5 月 10 日</p><p>  3D Terrain Generation Based o

3、n Height Map</p><p>  College:_ </p><p>  Specialty and Grade: </p><p>  Number: </p><p>  Name:

4、 </p><p>  Advisor: </p><p>  Submitted time: </p><p><b>  目錄</b></p><p>&l

5、t;b>  摘要1</b></p><p>  Abstract1</p><p><b>  1 緒論2</b></p><p>  1.1 研究的前景和意義2</p><p>  1.2 國內(nèi)外研究現(xiàn)狀2</p><p>  1.2 本文研究的內(nèi)容3</p

6、><p>  2 基于OpenGL+MFC的建?;A(chǔ)4</p><p>  2.1 OpenGL概述4</p><p>  2.2 OpenGL渲染管道5</p><p>  2.2.1 顯示列表5</p><p>  2.2.2 求值器5</p><p>  2.2.3 基于頂點(diǎn)的操作

7、5</p><p>  2.2.4 圖元裝配5</p><p>  2.2.5 像素操作6</p><p>  2.2.6 紋理裝配6</p><p>  2.2.7 光棚化6</p><p>  2.2.8 片斷操作6</p><p>  2.3 MFC概述6</p>

8、<p>  2.3.1 封裝7</p><p>  2.3.2 繼承7</p><p>  2.3.3 虛擬函數(shù)和動態(tài)約束8</p><p>  2.3.4 MFC的宏觀框架體系8</p><p>  2.4 MFC編程框架8</p><p>  2.5 基于OpenGL+MFC的三維模擬的編程環(huán)

9、境配置11</p><p>  3 基于高度圖的地形生成15</p><p>  3.1 由一幅高度圖生成地形的原理、關(guān)鍵算法15</p><p>  4 系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)17</p><p>  4.1 系統(tǒng)的實(shí)現(xiàn)的原理、關(guān)鍵技術(shù)17</p><p>  4.2 系統(tǒng)中高度圖的讀取、紋理映射18</

10、p><p>  4.3 系統(tǒng)的設(shè)計(jì)18</p><p>  4.4 實(shí)驗(yàn)結(jié)果(屏幕截圖)20</p><p>  5 結(jié)論與展望23</p><p><b>  5.1 結(jié)論23</b></p><p><b>  5.2 展望23</b></p><

11、;p><b>  致謝24</b></p><p><b>  參考文獻(xiàn)25</b></p><p><b>  摘要</b></p><p>  本文在吸取了計(jì)算機(jī)圖形學(xué)、現(xiàn)代數(shù)學(xué)、測繪學(xué)等眾多領(lǐng)域大量先進(jìn)理論成果的基礎(chǔ)上,研究了地形建模的基本理論和方法基于高度圖的地形生成技術(shù).文章分析了

12、基于高度圖的均勻網(wǎng)格地形渲染算法,給出了具體實(shí)現(xiàn)并提出了有效的改進(jìn)方法。該算法頂點(diǎn)數(shù)組來提高對均勻網(wǎng)格的渲染效率;在多細(xì)節(jié)層次算法中增加了地形邊緣的細(xì)節(jié)層次,使地形輪廓更為清楚。指出圖形生成是虛擬現(xiàn)實(shí)的關(guān)鍵問題并綜述了圖形生成的技術(shù);隨后回顧了地形生成及實(shí)時(shí)顯示技術(shù)和方法。在此基礎(chǔ)上通過在位圖的灰度值與地形高程之間建立映射關(guān)系,快速生成了三維網(wǎng)格地形.以生成具有高度真實(shí)感的三維地形。</p><p>  關(guān)鍵詞:

13、三維地形;三維圖形;地形建模;地形模型;灰度等級;三維地形模擬</p><p><b>  Abstract</b></p><p>  This thesis absorbing the computer graphics, the modern mathematics, the surveying and mapping and other advanced th

14、eory achievements, has studied the terrain modeling elementary theory and the method. This thesis analyzes the uniformity of the height map terrain rendering algorithms, and put forward the effective improvement methods.

15、 By improving the efficiency of rendering uniform grid and adding the edge of the level of detail terrain . The terrain contours become clearer. This thesis point</p><p>  Key words::3D terrain ;3D graph;t

16、erain modeling;terrain model;gray level;3Dterain simulating</p><p><b>  1 緒論</b></p><p>  1.1 研究的前景和意義</p><p>  地形系統(tǒng)的研究一直的圖形學(xué)的熱點(diǎn),虛擬地形主要幾種方法分為高度圖,分形等。隨著計(jì)算機(jī)圖形學(xué)理論以及計(jì)算機(jī)軟、硬件的

17、快速發(fā)展的發(fā)展,虛擬現(xiàn)實(shí)技術(shù)的發(fā)展的進(jìn)步人們對自然環(huán)境虛擬技術(shù)水平越來越高。三維地形圖的設(shè)計(jì)與實(shí)現(xiàn)成為了一個(gè)重要的研究方向,在虛擬現(xiàn)實(shí)生活中扮演著重要的角色。在構(gòu)建三維地形模型的基礎(chǔ)上,包括地形,河流,森林,建筑,乃至經(jīng)濟(jì),科學(xué),文化,教育等方面。地形在計(jì)算機(jī)上模擬成為當(dāng)今世界最熱門的話題,由傳統(tǒng)的以平面地形圖為介質(zhì)表示二維現(xiàn)實(shí)地形到用計(jì)算機(jī)完成三維地形世界的真實(shí)再現(xiàn),以一種直接的、可視化的、易于理解的形式表示三維地表信息,是對客觀真實(shí)

18、的立體地形認(rèn)識和表示的飛躍。根據(jù)模型的逼真度結(jié)合其他技術(shù)的應(yīng)用,以地形模型研究為基礎(chǔ),開展地形或大型工程、著名風(fēng)景名勝區(qū)的三維景觀實(shí)時(shí)顯示的研究,對于大型工程管理和仿真具有深遠(yuǎn)的學(xué)術(shù)意義,制作地形有好幾種方法來制作地形系統(tǒng)。每一種方法都有它的優(yōu)勢和弱勢,用高度圖來制作地形是相當(dāng)簡單的,而且它可以生成一些最為真實(shí)的地形結(jié)構(gòu),如果在制作地形期間,哪個(gè)細(xì)節(jié)或有大的變動,使用高度圖來實(shí)現(xiàn)的都可以快速的完成修改。三維地形就存在我們生活范圍,比如說

19、我們的</p><p>  1.2 國內(nèi)外研究現(xiàn)狀</p><p>  國外對虛擬三維的實(shí)時(shí)繪制技術(shù)研究主要集中在實(shí)時(shí)的可見性提出技術(shù)、多分辨率細(xì)節(jié)層次LOD簡化技術(shù)和基于圖像的繪制加速技術(shù)等。早在1976年,Clark就提出應(yīng)用圖形學(xué)理論管理地理信息思想。近兒年來,關(guān)于模型三維地形的研究非?;馃?,出現(xiàn)了各種算法和技術(shù),被模擬的對象也涉及到各個(gè)方面,比如光譜數(shù)據(jù)、地形數(shù)據(jù)以及自定義的幾何表

20、面等。1996年。Lindsstron等人提出了地形的連續(xù)LOD繪制算法,該算法采用了規(guī)整網(wǎng)格四叉樹。大部被地形生成算法所引用。由于這個(gè)算法是至底向上的,所以出現(xiàn)大量無用的數(shù)據(jù)[1]。1997年Rottge等人上面的算法進(jìn)進(jìn)的改進(jìn)。采用自頂向下的四叉樹,控制相鄰細(xì)節(jié)層次不超過1來進(jìn)行,算法實(shí)現(xiàn)了用GEOMIRPHING技術(shù)的來前者的不足[2]。2001年HenriHaki提出了菱形地形的繪算法:CLODP 這種算法基于幀相關(guān)的ROAM算

21、法,采用一種擇的幾何學(xué)結(jié)構(gòu),三角形四叉樹,這種結(jié)構(gòu)優(yōu)于三角帶,操作的次數(shù)減少許多[3]。2004年F.losasso和H.hoppe提出了用嵌套的規(guī)則網(wǎng)格來繪制地形?;?xì)節(jié)層次的方法,這個(gè)算法基于規(guī)則網(wǎng)格和以三角塊為無素的四叉樹結(jié)構(gòu)。但對硬</p><p>  國內(nèi)在三維地形實(shí)時(shí)繪制技術(shù)的研究方面開展了一些工作,并取得了一定的研究成果。如浙江大學(xué)CAD&CG國家重點(diǎn)實(shí)驗(yàn)室開發(fā)的桌面虛擬地形環(huán)境實(shí)時(shí)漫游系統(tǒng)

22、[7];浙江大學(xué)開發(fā)的虛擬地形;國防科技大學(xué)計(jì)算機(jī)學(xué)院設(shè)計(jì)并實(shí)現(xiàn)的高性能分布仿真系統(tǒng);北京航空航天大學(xué)虛擬現(xiàn)實(shí)與可視化新技術(shù)研究室集成的分布式虛擬環(huán)境系統(tǒng)等。這些系統(tǒng)對虛擬環(huán)境中的一些核心技術(shù)如實(shí)時(shí)圖形生成技術(shù),模型的簡化技術(shù)等領(lǐng)域進(jìn)行了研究。但是對一些相關(guān)的基礎(chǔ)性研究重視不夠。網(wǎng)絡(luò)三維地形中實(shí)體模型的創(chuàng)建和交互技術(shù)還有待進(jìn)一步研究.針對三維地形表面的特點(diǎn),深刻剖析0penGL標(biāo)準(zhǔn),在增強(qiáng)地形繪制效果和提高地形繪制速度方面還有待進(jìn)—步深

23、入研究.地形模型的簡化和多分辨率表示是三維地形模型能否實(shí)時(shí)繪制和進(jìn)行動態(tài)交互的關(guān)鍵。它是在現(xiàn)有計(jì)算機(jī)硬件設(shè)備不能滿足實(shí)時(shí)繪制和動態(tài)交互處理要求的前提下,從軟件著手,根據(jù)人眼觀察景物的特點(diǎn)和某個(gè)設(shè)定的精度要求,對不同地形區(qū)域采用不同的網(wǎng)格分辨率進(jìn)行繪制,精到每個(gè)點(diǎn);微機(jī)上對大規(guī)模地形實(shí)時(shí)繪制[8].從90年代開始,眾多學(xué)者從不同的角度出發(fā),針對地形的特點(diǎn),對地形模型的簡化和多分辨率表示技術(shù)進(jìn)行了初步地研究[9],</p>&

24、lt;p>  1.2 本文研究的內(nèi)容</p><p> ?。?)本文綜述各種三維地形生成技術(shù)的原理和實(shí)現(xiàn),分析各種三維地形生成算法,著重對基于高度</p><p>  圖的地形生成技術(shù)進(jìn)行深入分析,討論了基于高度圖的地形高程生成。</p><p> ?。?)基于高度圖的地表特征的生成,深入分析基于高度圖的地形生成。將三維地形逼真地繪制出來</p>

25、<p>  但是這是一項(xiàng)較為復(fù)雜的系統(tǒng)工程,需要借助于許多地形生成技術(shù)來實(shí)現(xiàn)簡單的基于高度圖的三維</p><p><b>  地形生成系統(tǒng)。</b></p><p> ?。?)基于格網(wǎng)高程映射,對高度圖進(jìn)行渲染生成地形圖</p><p>  2 基于OpenGL+MFC的建?;A(chǔ)</p><p>  2.1

26、 OpenGL概述</p><p>  OpenGL是個(gè)定義了一個(gè)跨編程語言、跨平臺的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenGL是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫。</p><p>  1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行

27、的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。</p><p>  1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。包括提高頂點(diǎn)位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識的傳輸速度,引入了新的紋理特性等等。</p><p>  1997年,Windows 95下3D游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個(gè)功能強(qiáng)大、兼容性好的3D圖形接口,而當(dāng)

28、時(shí)微軟公司自己的3D圖形接口DirectX 3.0功能卻是很糟糕。因而以制作《雷神之錘》等經(jīng)典3D射擊游戲而著名的id公司同其它一些游戲開發(fā)公司一同強(qiáng)烈要求微軟在Windows 95中加入對OpenGL的支持。微軟公司最終在Windows 95的OSR2版和后來的Windows 版本中加入了對OpenGL的支持。這樣,不但許多支持OpenGL的電腦3D游戲得到廣泛應(yīng)用,而且許多在3D圖形設(shè)計(jì)軟件也可以運(yùn)用支持OpenGL標(biāo)準(zhǔn)的3D加速卡

29、,大大提高其3D圖形的處理速度。</p><p>  2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式擴(kuò)展規(guī)格繪制語言“OpenGL Shading Language”。OpenGL 1.5的新功包括:頂點(diǎn)Buffer Object、Shadow功能、隱蔽查詢、非乘方紋理等。</p><p>  2004年8月,Open

30、GL2.0版本發(fā)布~OpenGL 2.0標(biāo)準(zhǔn)的主要制訂者并非原來的SGI,而是逐漸在ARB中占據(jù)主動地位的3Dlabs。opengl2.0支持OpenGL Shading Language、新的shader擴(kuò)展特性以及其他多項(xiàng)增強(qiáng)特性。</p><p>  2008年8月初Khronos工作組在Siggraph 2008大會上宣布了OpenGL 3.0圖形接口規(guī)范,GLSL1.30 shader語言和其他新增功能

31、將再次未來開放3D接口發(fā)展指明方向。</p><p>  OpenGL 3.0 API開發(fā)代號為Longs Peak,和以往一樣,OpenGL 3.0仍然作為一個(gè)開放性和跨平臺的3D圖形接口標(biāo)準(zhǔn),在Shader語言盛行的今天,OGL3.0增加了新版本的shader語言:GLSL 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。同時(shí),OGL3.0還引入了一些新的功能,例如頂點(diǎn)矩陣對象,全幀緩存對象功能,32bit浮

32、點(diǎn)紋理和渲染緩存,基于阻塞隊(duì)列的條件渲染,緊湊行半浮點(diǎn)頂點(diǎn)和像素?cái)?shù)據(jù),四個(gè)新壓縮機(jī)制等等。</p><p>  2009年3月又公布了升級版新規(guī)范OpenGL 3.1,也是這套跨平臺免費(fèi)API有史以來的第九次更新。OpenGL 3.1將此前引入的OpenGL著色語言“GLSL”從1.30版升級到了1.40版,通過改進(jìn)程序增強(qiáng)了對最新可編程圖形硬件的訪問,還有更高效的頂點(diǎn)處理、擴(kuò)展的紋理功能、更彈性的緩沖管理等等。

33、寬泛地講,OpenGL 3.1在3.0版的基礎(chǔ)上對整個(gè)API模型體系進(jìn)行了簡化,可大幅提高軟件開發(fā)效率。</p><p>  2009年8月Khronos小組發(fā)布了OpenGL 3.2,這是一年以來OpenGL進(jìn)行的第三次重要升級。該版本仍然延續(xù)了OpenGL發(fā)展的方向讓圖形程序開發(fā)者能在多種操作系統(tǒng)和平臺下更好的利用新的GPU功能。OpenGL3.2版本提升了性能表現(xiàn)、改進(jìn)了視覺質(zhì)量、提高了幾何圖形處理速度,而

34、且使Direct3D程序更容易移植為OpenGL。除OpenGL之外,Khronos還將其開發(fā)的其它標(biāo)準(zhǔn)進(jìn)行了協(xié)調(diào)改進(jìn),以求可以在更廣泛的領(lǐng)域提供強(qiáng)大的圖形功能和計(jì)算生態(tài)系統(tǒng),這些標(biāo)準(zhǔn)包括用于并行計(jì)算的OpenCL、用于移動3D圖形開發(fā)的OpenGL ES和用于網(wǎng)絡(luò)3D開發(fā)的WebGL。</p><p>  Khronos旗下的OpenGL ARB(Architecture Review Board)工作組推出了

35、GLSL 1.5OpenGLShading Language(OpenGL著色語言)的升級版,以及在OpenGL3.2框架下推出了兩個(gè)新功能,可以讓開發(fā)者在開發(fā)新程序時(shí)能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會提供與舊版OpenGL之間的兼容性。</p><p>  2.2 OpenGL渲染管道</p><p>  絕大多數(shù)OpenGL的實(shí)現(xiàn)都有一個(gè)的相類似的操作順

36、序,一系列處理階段稱為OpenGL渲染管道。如圖1 顯示了OpenGL處理數(shù)據(jù)的過程。幾何數(shù)據(jù)(頂點(diǎn)、線、多邊形)跟隨著這些路徑通過這些代表求值程序和每一個(gè)頂點(diǎn)操作的盒子,而像素?cái)?shù)據(jù)(像素、圖像、位圖)的部分加工處理過程有些不同。在將最后的像素?cái)?shù)據(jù)寫到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過最后相同的步驟(光柵化和片段操作)。</p><p>  圖1 OpenGL渲染管道</p><p>  下

37、面我們更為詳細(xì)的介紹OpenGL渲染管線的一些關(guān)鍵階段。</p><p>  2.2.1 顯示列表 </p><p>  任何數(shù)據(jù),不管它所描述的是幾何圖形還是像素,都可以保存在顯示列表(display list)中,供當(dāng)前或以后使用。當(dāng)然,我們也可以不把數(shù)據(jù)保存在顯示列表中,而是立即對數(shù)據(jù)進(jìn)行處理,這種模式也稱為立即模式(immediate mode)。當(dāng)一個(gè)顯示列表被執(zhí)行時(shí),被保存的數(shù)

38、據(jù)就從顯示列表中取出,就像在立即模式下直接由應(yīng)用程序所發(fā)送的那樣。</p><p>  2.2.2 求值器 </p><p>  所有的幾何圖元最終都要通過頂點(diǎn)來描述。參數(shù)化曲線和表面最初可能是通過控制點(diǎn)以及成為基函數(shù)(Basic function)的多項(xiàng)式函數(shù)進(jìn)行描述的。求職器提供了一種方法。根據(jù)控制點(diǎn)計(jì)算表示表面的頂點(diǎn)。這種方法是一種多項(xiàng)式映射,它可以根據(jù)控制點(diǎn)產(chǎn)生表面法線、紋理坐標(biāo)、

39、顏色以及空間坐標(biāo)。</p><p>  2.2.3 基于頂點(diǎn)的操作 </p><p>  對于頂點(diǎn)數(shù)據(jù),接下來的一個(gè)步驟就是"基于頂點(diǎn)的操作",就是把頂點(diǎn)變換為圖元。有些類型的頂點(diǎn)數(shù)據(jù)(例如空間坐標(biāo))是通過一個(gè)4*4的浮點(diǎn)矩陣進(jìn)行變換的??臻g坐標(biāo)從3D世界的一個(gè)位置投影到屏幕上的一個(gè)位置。</p><p>  如果啟用了高級特性,這個(gè)階段將更為忙

40、碌。如果使用了紋理,這個(gè)階段還將生成并變換紋理坐標(biāo)。如果啟用了光照,就需要綜合變換后的頂點(diǎn),表面法線,光源位置,材料屬性以及其他光照信息進(jìn)行光照計(jì)算,產(chǎn)生最終的顏色值。</p><p>  2.2.4 圖元裝配 </p><p>  圖元裝配的一個(gè)主要內(nèi)容就是剪裁,它的任務(wù)是消除位于半空間(half-space)之外的那部分幾何圖元,而這個(gè)半空間是由一個(gè)平面所定義的。點(diǎn)剪裁就是簡單地接受或

41、拒絕頂點(diǎn),直線或多邊形剪裁則可能需要添加額外的頂點(diǎn),具體取決于直線或多邊形是如何進(jìn)行剪裁的。在有些情況下,接下來需要執(zhí)行一個(gè)稱為透視除法(perspective division)的步驟。它使遠(yuǎn)處的物體看起來比近處的物體更小一些。接下來所進(jìn)行的是視口(viewport)和深度(z坐標(biāo))操作。如果啟用了剔除功能(culling)并且該圖元是個(gè)多邊形,那么它就有可能被剔除測試所拒絕。取決于多邊形模式,多邊形可能被畫成點(diǎn)的形式或者直線的形式。

42、</p><p>  這個(gè)階段所產(chǎn)生的結(jié)果就是完整的幾何圖元,也就是根據(jù)相關(guān)的顏色,深度(有時(shí)還有紋理坐標(biāo)值以及和光棚化處理有關(guān)的一些指導(dǎo)信息)進(jìn)行了變換和剪裁的頂點(diǎn)。</p><p>  2.2.5 像素操作 </p><p>  在OpenGL的渲染管線中,和單路徑的幾何數(shù)據(jù)相比,像素?cái)?shù)據(jù)所經(jīng)歷的流程有所不同。首先,來自系統(tǒng)內(nèi)存的一個(gè)數(shù)組中的像素進(jìn)行解包,從某種

43、格式(像素的原始格式可能有多種)解包為適當(dāng)數(shù)量的數(shù)據(jù)成分。接著,這些數(shù)據(jù)被縮放、偏移,并根據(jù)一副像素圖進(jìn)行處理。處理結(jié)果先進(jìn)行截取,然后或者寫入到紋理內(nèi)存,或者發(fā)送到光棚化階段。如果像素?cái)?shù)據(jù)時(shí)從幀緩沖區(qū)讀取的,就對他們執(zhí)行像素轉(zhuǎn)換操作(縮放、偏移、映射和截取)。然后,這些結(jié)果被包裝為一種適當(dāng)?shù)母袷?,并返回到系統(tǒng)內(nèi)存的一個(gè)數(shù)組中。</p><p>  OpenGL有一種特殊的像素復(fù)制操作,可以把數(shù)據(jù)從幀緩沖區(qū)復(fù)制到

44、幀緩沖區(qū)的其他位置或紋理內(nèi)存中。這樣,在數(shù)據(jù)寫入到紋理內(nèi)存或者寫回到幀緩沖區(qū)之前,只需要進(jìn)行一道像素轉(zhuǎn)換就可以了。</p><p>  2.2.6 紋理裝配 </p><p>  OpenGL應(yīng)用程序可以在幾何物體上應(yīng)用紋理圖像,使它們看上去更為逼真。如果需要使用多幅紋理圖像,把它們放在紋理對象中是一種明智的做法。這樣,就可以很方便地在他們之間進(jìn)行切換。</p><p&

45、gt;  有些OpenGL實(shí)現(xiàn)擁有一些特殊的資源,可以加速紋理的處理。這種資源可能是專用的,高性能的紋理內(nèi)存。如果確實(shí)擁有這種內(nèi)存,紋理對象可能會優(yōu)先進(jìn)行處理,以控制這種有限和寶貴的資源的使用。</p><p>  2.2.7 光棚化 </p><p>  光棚化就是把幾何數(shù)據(jù)和像素?cái)?shù)據(jù)轉(zhuǎn)換為片斷(fragment)的過程。每個(gè)片斷方塊對應(yīng)用于幀緩沖區(qū)中的一個(gè)像素。把頂點(diǎn)連接起來形成直線或

46、者計(jì)算填充多邊形的內(nèi)部像素時(shí),需要考慮直線和多邊形的點(diǎn)畫模式,直線的寬度,點(diǎn)的大小,著色模型以及用于支持抗鋸齒處理的覆蓋計(jì)算。每個(gè)片斷方塊都將具有各自的顏色和深度值。</p><p>  2.2.8 片斷操作 </p><p>  在數(shù)據(jù)實(shí)際存儲到幀緩沖區(qū)之前, 將要執(zhí)行一系列的操作。這些操作可能會修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。</p><p&g

47、t;  第一個(gè)可能遇到的操作是紋理化。在紋理內(nèi)存中為每個(gè)片斷生成一個(gè)紋理單元(texel,也就是紋理元素),并應(yīng)用到這個(gè)片斷上。接著可能進(jìn)行的是霧計(jì)算,然后是剪裁測試,alpha測試,模板測試和深度緩沖區(qū)測試(深度緩沖區(qū)用于消除被隱藏的表面)。如果一個(gè)片斷無法通過一個(gè)啟用的測試,它的連續(xù)處理過程可能會被中斷。隨后,將要執(zhí)行的可能是混合,抖動,邏輯操作以及根據(jù)一個(gè)位掩碼的屏蔽操作。最后,經(jīng)過完整處理的片斷就被繪制到適當(dāng)?shù)木彌_區(qū),最終成為一

48、個(gè)像素并到達(dá)它的最終歸宿。</p><p><b>  2.3 MFC概述</b></p><p>  MFC,微軟基礎(chǔ)類(Microsoft Foundation Classes), 用于在C++環(huán)境下編寫應(yīng)用程序的一個(gè)框架和引擎。該類庫提供一組通用的可重用的類庫供開發(fā)人員使用。大部分類均從CObject 直接或間接派生,只有少部分類例外。</p>&

49、lt;p>  MFC類庫作為C++與Windows的接口,建立在Win32應(yīng)用程序編程接口API之上,封裝了大多數(shù)的API函數(shù),主要是API中與程序結(jié)構(gòu)相關(guān)的部分和最常用的部分。MFC還封裝了重要的Windows擴(kuò)展,如COM,ActiveX,ODBC和Internet APIs,為這些難以編程實(shí)現(xiàn)的功能提供了簡便方法。</p><p>  MFC中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,讓程序員在此基礎(chǔ)上

50、來建立Windows下的應(yīng)用程序。MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Visual C++提供了相應(yīng)的工具來完成這個(gè)工作:AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于直觀地設(shè)計(jì)用戶界面;ClassWizard用來協(xié)助添加代碼到框架文件;最后進(jìn)行編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。</p>

51、<p>  在MFC編程中,入口函數(shù)WinMain()被封裝在MFC的應(yīng)用程序框架內(nèi),已經(jīng)不用也不可以再定義為另一個(gè)WinMain()函數(shù)。</p><p>  MFC編程最好的辦法是使用MFC的應(yīng)用程序向?qū)Чぞ逜ppWizard。AppWizard為程序員提供了一種快捷方便的工具來定制基于MFC的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來實(shí)現(xiàn)所需功能。</p><p

52、>  MFC是一個(gè)編程框架,MFC中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立Windows下的應(yīng)用程序,這是一種相對SDK來說更為簡單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Microsoft Visual C++提供了相應(yīng)的工具來完成這個(gè)工作:AppWizard可以用來生成初步的

53、框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。</p><p><b>  2.3.1 封裝 </b></p><p>  構(gòu)成MFC框架的是MFC類庫。MFC類庫是C++類庫。這些類或者封裝了Win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封

54、裝了OLE特性,或者封裝了ODBC和DAO數(shù)據(jù)訪問的功能,等等,分述如下。</p><p>  (1)對Win32應(yīng)用程序編程接口的封裝</p><p>  用一個(gè)C++ Object來包裝一個(gè)Windows Object。例如:class CWnd是一個(gè)C++ window object,它把Windows window(HWND)和Windows window有關(guān)的API函數(shù)封裝在C+

55、+ window object的成員函數(shù)內(nèi),后者的成員變量m_hWnd就是前者的窗口句柄。</p><p>  (2)對應(yīng)用程序概念的封裝</p><p>  使用SDK編寫Windows應(yīng)用程序時(shí),總要定義窗口過程,登記Windows Class,創(chuàng)建窗口,等等。MFC把許多類似的處理封裝起來,替程序員完成這些工作。另外,MFC提出了以文檔-視圖為中心的編程模式,MFC類庫封裝了對它的支

56、持。文檔是用戶操作的數(shù)據(jù)對象,視圖是數(shù)據(jù)操作的窗口,用戶通過它處理、查看數(shù)據(jù)。</p><p> ?。?)對COM/OLE特性的封裝</p><p>  OLE建立在COM模型之上,由于支持OLE的應(yīng)用程序必須實(shí)現(xiàn)一系列的接口(Interface),因而相當(dāng)繁瑣。MFC的OLE類封裝了OLE API大量的復(fù)雜工作,這些類提供了實(shí)現(xiàn)OLE的更高級接口。</p><p>

57、; ?。?)對ODBC功能的封裝</p><p>  以少量的能提供與ODBC之間更高級接口的C++類,封裝了ODBC API的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫編程模式。</p><p><b>  2.3.2 繼承 </b></p><p>  首先,MFC抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是C

58、Object和CCmdTarget。CObject是MFC的根類,絕大多數(shù)MFC類是其派生的,包括CCmdTarget。CObject 實(shí)現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget派生。</p>

59、;<p>  針對每種不同的對象,MFC都設(shè)計(jì)了一組類對這些對象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd,派生了CView類;應(yīng)用程序?qū)ο?,基類是CwinThread;文檔對象,基類是Cdocument,等等。</p><p>  程序員將結(jié)合自己的實(shí)際,從適當(dāng)?shù)腗FC類中派生出自己的類,實(shí)現(xiàn)特定的功能,達(dá)到自己的編程目的。</

60、p><p>  2.3.3 虛擬函數(shù)和動態(tài)約束 </p><p>  MFC以“C++”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個(gè)編程框架,有一個(gè)問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝 Windows窗口對象時(shí),每一條Windows消息對應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),

61、由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于是,MFC建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。</p><p>  這樣,通過虛擬函數(shù)和消息映射,MFC類提供了豐富的編程接口。程序員繼承基類的同時(shí),把自己實(shí)現(xiàn)的虛擬函數(shù)和消息處理函數(shù)嵌入MFC的編程框架。MFC編程框架將在適當(dāng)?shù)臅r(shí)候、適當(dāng)?shù)牡胤絹碚{(diào)用程序的代碼。本書將充分的展示MFC調(diào)用虛擬函數(shù)和消息處理函數(shù)的內(nèi)幕,讓讀者對MFC的編

62、程接口有清晰的理解。</p><p>  2.3.4 MFC的宏觀框架體系 </p><p>  如前所述,MFC實(shí)現(xiàn)了對應(yīng)用程序概念的封裝,把類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用等封裝起來。這樣封裝的結(jié)果對程序員來說,是一套開發(fā)模板(或者說模式)。針對不同的應(yīng)用和目的,程序員采用不同的模板。例如,SDI應(yīng)用程序的模板,MDI應(yīng)用程序的模板,規(guī)則DLL應(yīng)用程序的模板,擴(kuò)展DLL應(yīng)用程

63、序的模板,OLE/ACTIVEX應(yīng)用程序的模板,等等。</p><p>  這些模板都采用了以文檔-視為中心的思想,每一個(gè)模板都包含一組特定的類。典型的MDI應(yīng)用程序的構(gòu)成將在下一節(jié)具體討論。</p><p>  為了支持對應(yīng)用程序概念的封裝,MFC內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如,為了實(shí)現(xiàn)對DLL編程的

64、支持和多線程編程的支持,MFC內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內(nèi)部處理對程序員來說是透明的,但是,懂得和理解MFC內(nèi)部機(jī)制有助于寫出功能靈活而強(qiáng)大的程序。</p><p>  總之,MFC封裝了Win32 API,OLE API,ODBC API等底層函數(shù)的功能,并提供更高一層的接口,簡化了Windows編程。同時(shí),MFC支持對底層API的直接調(diào)用。</p&g

65、t;<p>  MFC提供了一個(gè)Windows應(yīng)用程序開發(fā)模式,對程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等??蚣芑蛘哂善浔旧硖幚硎录灰蕾嚦绦騿T的代碼;或者調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。</p><p>  MFC是C++類庫,程序員就是通過使用、繼承和擴(kuò)展適當(dāng)?shù)念悂韺?shí)現(xiàn)特定的目的。例如,繼承時(shí),應(yīng)用程序特定的事件由程序

66、員的派生類來處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是C++對繼承的支持,對虛擬函數(shù)的支持,以及MFC實(shí)現(xiàn)的消息映射機(jī)制。</p><p>  2.4 MFC編程框架</p><p>  用AppWizard產(chǎn)生一個(gè)MDI工程t(無OLE等支持),AppWizard創(chuàng)建了一系列文件,構(gòu)成了一個(gè)應(yīng)用程序框架。這些文件分四類:頭文件(.h),實(shí)現(xiàn)文件(.cpp),資源文件(.rc),模塊

67、定義文件(.def),等。 </p><p> ?。╝)構(gòu)成應(yīng)用程序?qū)ο?lt;/p><p>  下圖解釋了該應(yīng)用程序的結(jié)構(gòu),箭頭表示信息流向。 </p><p>  圖2 MDI應(yīng)用程序的構(gòu)成</p><p>  從CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd類對應(yīng)地派生出CTApp、CTD

68、oc、CTView、CMainFrame、CChildFrame五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο?、文檔對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對這些類或者對象解釋如下。 </p><p><b> ?。?)應(yīng)用程序 </b></p><p>  應(yīng)用程序類派生于CWinApp?;诳蚣艿膽?yīng)用程序必須有且只有一個(gè)應(yīng)

69、用程序?qū)ο螅?fù)責(zé)應(yīng)用程序的初始化、運(yùn)行和結(jié)束。 </p><p><b>  (2)邊框窗口 </b></p><p>  如果是SDI應(yīng)用程序,從CFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含視窗口;如果是MDI應(yīng)用程序,從CMDIFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含文檔邊框窗

70、口。 </p><p>  如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加CToolBar和CStatusBar類型的成員變量,以及在一個(gè)OnCreate消息處理函數(shù)中初始化這兩個(gè)控制窗口。 </p><p>  邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預(yù)覽)。 </p><p>

71、; ?。?)文檔邊框窗口 </p><p>  文檔邊框窗口類從CMDIChildWnd類派生,MDI應(yīng)用程序使用文檔邊框窗口來包含視窗口。 </p><p><b>  (4)文檔 </b></p><p>  文檔類從CDocument類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實(shí)現(xiàn)的。視窗口通過文檔對象來訪問和更新數(shù)據(jù)。 </

72、p><p><b>  (5)視 </b></p><p>  視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對文檔的操作。 </p><p><b> ?。?)文檔模板 </b></p><p>  (a)文檔模板類一般

73、不需要派生。MDI應(yīng)用程序使用多文檔模板類CMultiDocTemplate;SDI應(yīng)用程序使用單文檔模板類CSingleDocTemplate。 應(yīng)用程序通過文檔模板類對象來管理上述對象(應(yīng)用程序?qū)ο?、文檔對象、主邊框窗口對象、文檔邊框窗口對象、視對象)的創(chuàng)建。 </p><p> ?。╞)構(gòu)成應(yīng)用程序的對象之間的關(guān)系</p><p>  圖3 應(yīng)用程序的對象之間的關(guān)系</p>

74、;<p>  用圖的形式可直觀地表示所涉及的MFC類的繼承或者派生關(guān)系,如圖3所示意。 圖所示的類都是從CObject類派生出來的;所有處理消息的類都是從CCmdTarget類派生的。如果是多文檔應(yīng)用程序,文檔模板使用CMultiDocTemplae,主框架窗口從CMdiFarmeWnd派生,它包含工具條、狀態(tài)欄和文檔框架窗口。文檔框架窗口從CMdiChildWnd派生,文檔框架窗口包含視,視從CView或其派生類派生。&

75、lt;/p><p> ?。╟) 構(gòu)成應(yīng)用程序的文件</p><p>  通過上述分析,可知AppWizard產(chǎn)生的MDI框架程序的內(nèi)容,所定義和實(shí)現(xiàn)的類。下面,從文件的角度來考察AppWizard生成了哪些源碼文件,這些文件的作用是什么。表1列出了AppWizard所生成的頭文件,表2列出了了AppWizard所生成的實(shí)現(xiàn)文件及其對頭文件的包含關(guān)系。 </p><p>

76、  表1 AppWizard所生成的頭文件</p><p>  表2 AppWizard所生成的實(shí)現(xiàn)文件 </p><p>  從表2中的包含關(guān)系一欄可以看出: </p><p>  CTApp 的實(shí)現(xiàn)用到所有的用戶定義對象,包含了他們的定義;CView 的實(shí)現(xiàn)用到CTdoc;其他對象的實(shí)現(xiàn)只涉及自己的定義; </p><p>  當(dāng)然,如

77、果增加其他操作,引用其他對象,則要包含相應(yīng)的類的定義文件。</p><p>  2.5 基于OpenGL+MFC的三維模擬的編程環(huán)境配置</p><p>  下面介紹在VC 環(huán)境中建立基于 OpenGL 標(biāo)準(zhǔn)的應(yīng)用程序框架的具體方法與步驟</p><p>  (1) 創(chuàng)建MFC項(xiàng)目文件:選擇File/New 菜單選項(xiàng),建立一個(gè)名為 MyTest 的單文檔 (SDI)

78、 應(yīng)用程序 </p><p>  (2) 配置OpenGL編程環(huán)境:即添加OpenGL圖形開發(fā)接口庫文件。選擇Project/Setting 菜單選項(xiàng),在 Link 欄的 Lib 輸入域中添加 openg132.lib 、 glu32.lib ,若需使用 OpenGL 的輔助庫函數(shù),則還需添加 glaux.lib 。 </p><p>  (3) 為CMyTestView 類添加成員函數(shù)

79、void Init() ,用于初始化,代碼如下:</p><p>  HGLRC hrc; </p><p>  m_pDC = new CClientDC(this);// OpenGL初始化工作:獲取dc</p><p>  if (!bSetupPixelFormat()) //設(shè)置像素格式</p><p>  hrc = wglC

80、reateContext(m_pDC->GetSafeHdc());//創(chuàng)建RC</p><p>  glViewport(0, 0, w, h); </p><p>  gluPerspective(45,ratio,1,1000);//設(shè)置OpenGL視口變換</p><p>  (4) 為CMyTestView 類添加成員函數(shù) BOOL bSetupP

81、ixelFormat(void) , 用于與OpenGL 相關(guān)的設(shè)置 </p><p>  /*定 義 像 素 存 儲 格 式 */ </p><p>  BOOL CMyTerrain1View::SetupPixelFormat()</p><p><b>  {</b></p><p>  PIXELFOR

82、MATDESCRIPTOR pfd = { </p><p>  sizeof(PIXELFORMATDESCRIPTOR), // pfd結(jié)構(gòu)的大小 </p><p>  1, // 版本號 </p><p>  PFD_DRAW_TO_WINDOW | // 支持在窗口

83、中繪圖 </p><p>  PFD_SUPPORT_OPENGL | // 支持 OpenGL </p><p>  PFD_DOUBLEBUFFER, // 雙緩存模式 </p><p>  PFD_TYPE_RGBA, // RGBA 顏色模式 </p>

84、<p>  24, // 24 位顏色深度 </p><p>  0, 0, 0, 0, 0, 0, // 忽略顏色位 </p><p>  0, // 沒有非透明度緩存 </p><p>  0,

85、 // 忽略移位位 </p><p>  0, // 無累加緩存 </p><p>  0, 0, 0, 0, // 忽略累加位 </p><p>  32,

86、 // 32 位深度緩存 </p><p>  0, // 無模板緩存 </p><p>  0, // 無輔助緩存 </p><p>  PFD_MAIN_PLANE, // 主層

87、</p><p>  0, // 保留 </p><p>  0, 0, 0 // 忽略層,可見性和損毀掩模 </p><p><b>  }; </b></p><p>  int pixelformat

88、;</p><p>  pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//選擇像素格式</p><p>  ::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd);//設(shè)置像素格式</p><p>  i

89、f(pfd.dwFlags & PFD_NEED_PALETTE)</p><p>  SetLogicalPalette();//設(shè)置邏輯調(diào)色板</p><p>  return TRUE;</p><p><b>  }</b></p><p>  (5) 為CMyTestView 類添加一個(gè)公有的成員變量

90、,類型為 CClientDC ,命名為* m_pDC。 </p><p>  (6) 為CMyTestView 類添加 WM_DESTROY 函數(shù),并修改代碼如下:注意,新添加的代碼一定要加在原來代碼之前,即 m_pDC 要先進(jìn)行銷毀。</p><p>  void CMyTestView ::OnDestroy() //清理工作</p><p><b>

91、;  { </b></p><p>  HGLRC hrc; </p><p>  hrc =::wglGetCurrentContext(); </p><p>  ::wglMakeCurrent(NULL, NULL); </p><p><b>  if (hrc) </b></p>

92、<p>  ::wglDeleteContext(hrc); </p><p>  if (m_pDC) </p><p>  delete m_pDC; </p><p>  CView::OnDestroy(); </p><p>  // TODO: Add your message handler code here <

93、;/p><p><b>  } </b></p><p>  (7) 最后在中CMyTestView.h 中包含 OpenGL 所需的頭文件 </p><p>  #include <gl\gl.h> </p><p>  #include <gl\glu.h> </p><p&

94、gt;  #include <gl\glut.h> </p><p><b>  編譯、運(yùn)行程序。</b></p><p><b>  (8)設(shè)置投影模式</b></p><p>  glViewport()用于設(shè)置視口,我們這里將其設(shè)置成與視區(qū)一樣大,這樣也能約束投影圖形的縱橫比例,使其不至于變形。</

95、p><p>  glMaritxMode(GL_PROJECTION)選擇當(dāng)前要做變換的矩陣為投影矩陣,后面的GL_MatrixMode(GL_MODELVIEW)則設(shè)置要做變換的矩陣為模視矩陣,因?yàn)槲覀兒竺鎸⒁玫降钠揭坪托D(zhuǎn)變換都是針對模視矩陣的。</p><p>  glLoadIdentity()用于重置當(dāng)前矩陣,即將當(dāng)前矩陣設(shè)置為單位矩陣。</p><p> 

96、 gluPerspective()則設(shè)置投影方式為透視投影。</p><p>  ///////////////////////////////////////////////////////////////////////</p><p><b>  //設(shè)置透視模式</b></p><p>  glViewport(0,0,w,h);<

97、;/p><p>  glMatrixMode(GL_PROJECTION);//選擇投影矩陣</p><p>  glLoadIdentity();//重置投影矩陣</p><p>  gluPerspective(60.0,(GLfloat)w/h,0.1,100.0);//設(shè)置投影方式及投影參數(shù)</p><p&g

98、t;  glMatrixMode(GL_MODELVIEW);//選擇模視矩陣</p><p>  glLoadIdentity();</p><p>  與圖形學(xué)一致,OpenGL支持兩種投影方式:平行投影和透視投影,分別由基本庫中的glOrtho()和glFrustum()函數(shù)實(shí)現(xiàn)。</p><p>  glOrtho()的原型為:</p

99、><p>  void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far );</p><p>  其裁剪視體和參數(shù)設(shè)置如下圖所示:</p><p>  該函數(shù)得到的投影矩陣為:</p><p> 

100、 glFrustum()的原型為:</p><p>  void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);</p><p>  其裁剪視體和參數(shù)定義如下圖所示:</p><p>  其生成的投影矩陣為:</p&

101、gt;<p>  對于透視投影,實(shí)用庫中提供了另一個(gè)函數(shù)gluPerspective(),它在使用上更方便,但實(shí)質(zhì)上和glFrustum()是一樣的。</p><p>  gluPerspective()的函數(shù)原型為:</p><p>  void gluPerspective(GLdouble fovy, GLdouble aspect,GLdouble near, GLd

102、ouble far</p><p>  3 基于高度圖的地形生成</p><p>  3.1 由一幅高度圖生成地形的原理、關(guān)鍵算法</p><p>  本文,三維空間中的水平面是xz平面,高度對應(yīng)y值。所以可以將高度圖的每一個(gè)像素對應(yīng)生成三維空間中的一個(gè)頂點(diǎn),像素的二維坐標(biāo)值對應(yīng)三維頂點(diǎn)的(x,z)值,亮度值對應(yīng)頂點(diǎn)的y值??梢圆捎梦粓D的格式來表示地形的高程,即用藍(lán)

103、白色的深淺(灰度)來表示山勢的高低,本文定義白色為最高,藍(lán)色為最低。這樣就生成了用來表示高度的高程灰度圖。</p><p><b>  圖4 格網(wǎng)</b></p><p>  根椐高度圖生成地形的原理畫出上如圖4的格網(wǎng),并分別以左下角設(shè)為(lx ly )右上角設(shè)為(rx ry),設(shè)網(wǎng)格有m行*n列,任取G(i j)網(wǎng)格的四角點(diǎn)的坐標(biāo)分別用P1、 P2、 P3 、P4

104、來表示如上圖所示。</p><p>  則可以計(jì)算出格網(wǎng)的長寬的數(shù)值。</p><p>  dx=(rx-lx)/m</p><p>  dy=(ry-ly)/n</p><p>  當(dāng)前 G(i j) p1(dxidyj)</p><p>  G(i j) P2(dx dy(j+1))</p><

105、p>  G(i j) P3(dx(i+1) dy(j+1))</p><p>  G(i j) P4(dx(i+1)dyj ) </p><p>  插入每個(gè)格網(wǎng)G(i j)的4個(gè)角點(diǎn)坐標(biāo)的x、y的計(jì)算公式</p><p>  P1.x = lx+i*dx </p><p>  P1.y = ly+j*dy</p><

106、;p>  P2.x = lx+i*dx </p><p>  P2.y = ly+dy*(j+1)</p><p>  P3.x = lx+dx*(i+1) </p><p>  P3.y = ly+dy(j+1) </p><p>  P4.x = lx+dx(i+1) </p><p>  P4.y

107、= ly+dy*j</p><p>  從上面的計(jì)算我們可以得出網(wǎng)格中的每一個(gè)點(diǎn)都可以用坐標(biāo)表示出來?;诰W(wǎng)格的算法可以求出高度值Z,假設(shè)像素顏色RGB每個(gè)分量取值為0~255, 高程值插入的范圍為用戶輸入的高程范圍,變量min~max 的用戶輸入變量。建立高程映射方程:</p><p>  z=FUN(x y)=R**(min + (max-min)) +G *(min + (max-

108、min)) +B *(min + (max-min)), </p><p>  用公式計(jì)算每個(gè)點(diǎn)的高程值,其中RGB是取0~255之間, 高程值變量min~max 的用戶輸入變量。就得到一個(gè)從藍(lán)白顏色變化的地形,可以直觀的分辯出地形的高低效果,這種算法繼承了現(xiàn)有算法的優(yōu)勢,并對一些薄弱環(huán)竹進(jìn)行了改進(jìn),提高了執(zhí)行效率。</p><p>  將高度圖(即紋理圖片)的像素(m*n個(gè))映射到地形格

109、網(wǎng)(m*n個(gè),每個(gè)為正方形或矩形),每個(gè)格網(wǎng)四個(gè)角點(diǎn)的坐標(biāo)(x、z 為地形的x,z; y坐標(biāo)表示高程從高度圖中讀取,根據(jù)z=FUN(x y換算: 假設(shè)像素顏色RGB每個(gè)分量取值為0~255, 高程值min~max 的用戶輸入變量,建立高程映射方程:R分量值*(min + (max-min)) +G分量值*(min + (max-min)) +B分量值*(min + (max-min)), 從而將圖片的顏色值(灰度或彩色)映射為高程,且這

110、些顏色分量值作為計(jì)算高程的權(quán)重;此外建立整個(gè)地形左下角坐標(biāo)(x0,y0,z0) 右上角坐標(biāo)(x1,y1,z1)到地形各個(gè)格網(wǎng)點(diǎn)坐標(biāo)的(x,y,z)的映射,其中的y就是上面的紋理圖片到高程的映射,還要建立其中的(x,z)和整個(gè)地形左下角右上角坐標(biāo)之間的換算,因?yàn)榈匦斡衜*n個(gè)格網(wǎng),將高度圖上的各個(gè)像素值RGB作為權(quán)重合成地表特征,假設(shè)R分量表示巖石,G分量表示草地,B分量表示水面,則地表特征可計(jì)算如下 :R分量值*巖石特征變量 +G分量值

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論