版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 論文題目:_3D飛行訓(xùn)練系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_</p><p><b> 目錄</b></p><p><b> 摘 要1</b></p><p><b> 第一章 緒論2</b></p><p> 1.1研究3D飛行訓(xùn)練系統(tǒng)的背景及研究的意義
2、2</p><p> 1.2 飛行訓(xùn)練系統(tǒng)的國內(nèi)外研究現(xiàn)狀2</p><p> 1.3 本論文的基本路線3</p><p> 第二章 基于OpenGL+MFC的建?;A(chǔ)4</p><p> 2.1 OpenGL的概念4</p><p> 2.2 OpenGL的發(fā)展歷程4</p><
3、;p> 2.3 OpenGL的渲染管道5</p><p> 2.3.1顯示列表 5</p><p> 2.3.2求值程序6</p><p> 2.3.3基于頂點(diǎn)的操作6</p><p> 2.3.4初步組裝6</p><p> 2.3.5像素操作6</p><p>
4、 2.3.6紋理裝配6</p><p> 2.4 MFC的概述6</p><p> 2.5MFC的特點(diǎn)7</p><p><b> 2.5.1封裝7</b></p><p><b> 2.5.2繼承7</b></p><p> 2.5.3虛擬函數(shù)和動(dòng)態(tài)約
5、束7</p><p> 2.6 MFC的編程框架8</p><p> 2.6.1 MFC的宏觀框架體系8</p><p> 2.7MDI應(yīng)用程序構(gòu)成8</p><p> 2.7.1構(gòu)成應(yīng)用程序?qū)ο?</p><p> 2.7.2構(gòu)成應(yīng)用程序的對(duì)象之間的關(guān)系10</p><p&g
6、t; 2.7.3構(gòu)成應(yīng)用程序的文件10</p><p> 2.8 基于OpenGL+MFC的三維模擬的編程環(huán)境配置11</p><p> 第三章飛行訓(xùn)練系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)14</p><p> 3.1 系統(tǒng)的設(shè)計(jì)14</p><p> 3.1.1系統(tǒng)結(jié)構(gòu)的類14</p><p> 3.1.2 場(chǎng)景繪
7、制及渲染16</p><p> 3.1.3 飛機(jī)訓(xùn)練系統(tǒng)的關(guān)鍵模擬技術(shù)17</p><p> 3.1.4 加載矩陣,控制模型變換19</p><p> 3.2系統(tǒng)實(shí)現(xiàn)的原理及關(guān)鍵技術(shù)19</p><p> 3.2.1基本的OpenGL幾何變換20</p><p> 3.2.2 三維平移20<
8、/p><p> 3.3 實(shí)驗(yàn)結(jié)果效果圖22</p><p> 第四章 結(jié)論與展望24</p><p><b> 參考文獻(xiàn)25</b></p><p><b> 致 謝26</b></p><p><b> 摘 要</b></p&g
9、t;<p> 研究在普通的PC 機(jī)下開發(fā)高質(zhì)量的視景仿真系統(tǒng)。在Windows NT 系統(tǒng)下,以Visual C + + 為開發(fā)平臺(tái),利用OpenGL和串口技術(shù),運(yùn)用面向?qū)ο蟮木幊趟枷?采用MFC 的編程方法[1]。首先簡介了OpenGL 及如何利用它進(jìn)行復(fù)雜的三維建模、文本顯示、天空和地形繪制以及動(dòng)畫生成的技術(shù)。本文在OpenGL的開發(fā)基礎(chǔ)上,開發(fā)通過鼠標(biāo)和鍵盤進(jìn)行操作的虛擬飛行訓(xùn)練系統(tǒng),通過飛行訓(xùn)練系統(tǒng)為飛行員提供了
10、零危險(xiǎn)的飛行訓(xùn)練,飛行訓(xùn)練系統(tǒng)提供了一個(gè)身臨其境的交互式仿真環(huán)境,對(duì)飛行訓(xùn)練中的場(chǎng)景進(jìn)行模擬,實(shí)現(xiàn)了人機(jī)自然交互;實(shí)驗(yàn)表明本文的方法在OpenGL場(chǎng)景中仿真飛機(jī)的飛行狀態(tài),如實(shí)的反應(yīng)出飛機(jī)的飛行狀態(tài)。最終,較好地解決了飛行器三維實(shí)時(shí)顯示與逼真的場(chǎng)景之間的矛盾[2]。</p><p> 關(guān)鍵詞:開放式圖形庫;動(dòng)畫;仿真;建模;</p><p><b> ABSTRACT<
11、/b></p><p> This article focus on the study of developing simulation system running on PC. We implement the simulation using OOP method on the platform integrated with VC++ and OpenGL. First introduced t
12、he OpenGL and how to use it for complex 3d modeling, text display, the sky and the terrain rendering and animation of technology. The developed virtual flight training system provided users with friendly manipulations of
13、 keyboard and mouse for rich control. This kind of flight training system can remarkably </p><p> KEYWORDS : OpenGL ; Animation ; Simulation ; Modeling</p><p><b> 第一章 緒論</b></p
14、><p> 1.1研究3D飛行訓(xùn)練系統(tǒng)的背景及研究的意義</p><p> 過去,在航空航天和軍事仿真等領(lǐng)域的許多系統(tǒng)的開發(fā)研制過程中,飛行器的研制往往依靠飛行實(shí)驗(yàn)來完成型號(hào)的定型,研制過程漫長而且花費(fèi)巨大。目前,隨著計(jì)算機(jī)多媒體技術(shù)、可視化技術(shù)及圖形學(xué)技術(shù)的發(fā)展,我們可以使用計(jì)算機(jī)來精確地再現(xiàn)現(xiàn)實(shí)世界中的絢麗多彩的三維物體,并充分發(fā)揮自身的創(chuàng)造性思維,通過人機(jī)交互來模擬、改造現(xiàn)實(shí)世界,這
15、就是目前最為時(shí)髦的虛擬現(xiàn)實(shí)技術(shù)。通過這種技術(shù),建筑工程師可以直接設(shè)計(jì)出美觀的樓房模型;軍事指揮員可以模擬戰(zhàn)場(chǎng)進(jìn)行軍事推演,網(wǎng)民可以足不出戶游覽故宮博物館等名勝古跡等。而虛擬現(xiàn)實(shí)技術(shù)最重要的一部分內(nèi)容就是三維圖形編程。用三維仿真系統(tǒng)進(jìn)行模擬飛行訓(xùn)練是國內(nèi)外通常采用的有效方法。OpenGL是一個(gè)開放式的針對(duì)圖形硬件的三維圖形軟件包,具有良好的平臺(tái)無關(guān)性,開發(fā)者可以利用它來建立三維模型和進(jìn)行三維實(shí)時(shí)交互,從而實(shí)現(xiàn)所謂的“虛擬的真實(shí)”,所以多采
16、用OpenGL進(jìn)行飛機(jī)三維仿真。</p><p> 1.2 飛行訓(xùn)練系統(tǒng)的國內(nèi)外研究現(xiàn)狀</p><p> 國外對(duì)于飛行訓(xùn)練系統(tǒng)的研制最早從六自由度運(yùn)動(dòng)平臺(tái)開始逐步向集成化、綜合化發(fā)展,目前的系統(tǒng)已經(jīng)成為集電氣、機(jī)械、控制、自動(dòng)化為一體的現(xiàn)代化高科技產(chǎn)品。國外的許多院校和研究機(jī)構(gòu)都進(jìn)行了飛行訓(xùn)練系統(tǒng)的研究,比較著名的如Delft大學(xué)、荷蘭的NLR實(shí)驗(yàn)室等[3],為系統(tǒng)的開發(fā)提供了技術(shù)支
17、持。美國空軍早在1969年就開始利用仿真系統(tǒng)[4]代替部分實(shí)際飛行,使用仿真系統(tǒng)后的飛行費(fèi)用下降幅度達(dá)66%至95%。3D飛行訓(xùn)練系統(tǒng)在模擬系統(tǒng)開發(fā)里起到了重要作用,它把研制的虛擬場(chǎng)景,在視覺上、操作訓(xùn)練環(huán)境和程序形成高度逼真,有效解決院校和部隊(duì)飛行教學(xué)訓(xùn)練中的難題,縮短了訓(xùn)練周期,提高了訓(xùn)練效益。</p><p> 飛行訓(xùn)練系統(tǒng)已有了驚人的進(jìn)步。其主要表現(xiàn)是:</p><p> 1、
18、飛行訓(xùn)練視景系統(tǒng)經(jīng)歷了多次變革,經(jīng)由機(jī)械式、光學(xué)造影型和閉路電視系統(tǒng)發(fā)展到高逼真度的計(jì)算機(jī)成像視景系統(tǒng)。</p><p> 2、飛行員動(dòng)感模擬,由原來無法模擬過載的固定機(jī)艙,發(fā)展成為可借助六自由度運(yùn)動(dòng)模擬系統(tǒng)支撐的模擬活動(dòng)座艙。除此,還可以提供先進(jìn)廉價(jià)的G座椅、抖動(dòng)座椅、高G負(fù)荷黑視頭盔、模擬抗荷服等形式的動(dòng)感模擬設(shè)施。</p><p> 3、作為飛行模擬器核心的仿真計(jì)算機(jī)系統(tǒng),在經(jīng)歷
19、了三次變革浪潮后,已進(jìn)入全數(shù)字實(shí)時(shí)仿真階段,不僅有很寬譜型的仿真計(jì)算機(jī)體制結(jié)構(gòu)可供人們選擇,而且高性能價(jià)格比的超級(jí)實(shí)時(shí)工作站已加入飛行模擬器的仿真計(jì)算機(jī)系統(tǒng)行列。</p><p> 4、多媒體技術(shù)、虛擬現(xiàn)實(shí)技術(shù)、分布交互仿真技術(shù)正在從根本上改變傳統(tǒng)飛行訓(xùn)練系統(tǒng)的形式和結(jié)構(gòu)。其次是系統(tǒng)功能和應(yīng)用范圍的不斷擴(kuò)大。飛行訓(xùn)練系統(tǒng)由最初的僅提供飛行員操作使用,擴(kuò)展到目前成為新機(jī)研制必不可少的手段,是現(xiàn)代航空理論、技術(shù)和方
20、法研究的主要支柱和新機(jī)首飛前的試飛員培訓(xùn)的唯一工具。特別是地面飛行模擬技術(shù)同空中飛行模擬技術(shù)的結(jié)合所出現(xiàn)的空地綜合飛行模擬系統(tǒng),給改善飛行訓(xùn)練系統(tǒng)性能和擴(kuò)大模擬器應(yīng)用領(lǐng)域開辟了一個(gè)新的途徑,進(jìn)一步展現(xiàn)出了飛行訓(xùn)練系統(tǒng)的廣闊發(fā)展空間。</p><p> 我國計(jì)算機(jī)訓(xùn)練系統(tǒng)領(lǐng)域在50年代末開始對(duì)飛機(jī)控制系統(tǒng)進(jìn)行仿真實(shí)驗(yàn)[5],自行研制了仿真設(shè)備,在“七五”、“八五”期間,我國建立了一批大型的仿真實(shí)驗(yàn)室或仿真系統(tǒng),我
21、我國研制飛機(jī)的過程中發(fā)揮了重要的作用。</p><p> 通過對(duì)比國內(nèi)外飛行訓(xùn)練系統(tǒng)的發(fā)展?fàn)顩r可以得到下述結(jié)論:</p><p> 1、國外飛行訓(xùn)練系統(tǒng)具有豐富的經(jīng)驗(yàn),國內(nèi)對(duì)于飛行訓(xùn)練系統(tǒng)在軍用模擬上雖有較大的發(fā)展,但軍用飛行訓(xùn)練系統(tǒng)考慮到戰(zhàn)術(shù)、機(jī)動(dòng)性等方面的要求,較多采用的為固定基座的模擬,通過視景和抖振座椅實(shí)現(xiàn)飛機(jī)的動(dòng)感模擬,逼真度相對(duì)較差。在民用飛行模擬器上的發(fā)展緩慢。</
22、p><p> 2、在系統(tǒng)集成上,國外具有較好的經(jīng)驗(yàn)積累,可以進(jìn)行多種條件下的綜合集成,而國內(nèi)在飛行訓(xùn)練系統(tǒng)方面,還處于嘗試階段,主要的產(chǎn)品還依靠國外的系統(tǒng),主要系統(tǒng)的集成化程度不高。</p><p> 3、國內(nèi)使用的技術(shù)多數(shù)參照國外的經(jīng)驗(yàn)技術(shù),自主開發(fā)的較少,沒有形成獨(dú)有的技術(shù)體系,同國外相比競爭力等相對(duì)較差。</p><p> 1.3 本論文的基本路線</
23、p><p> 由于硬件的限制,本文著重的模擬通過鼠標(biāo)和鍵盤的系統(tǒng)交互式操作,進(jìn)而對(duì)仿真飛行訓(xùn)練系統(tǒng)的的實(shí)現(xiàn)。</p><p> 論文的的章節(jié)安排如下:</p><p> 第一章:分析研究飛行訓(xùn)練系統(tǒng)的重要性,對(duì)飛行訓(xùn)練系統(tǒng)的特點(diǎn)、研究現(xiàn)狀進(jìn)行了概述,對(duì)飛行仿真技術(shù)進(jìn)行了介紹。</p><p> 第二章:簡單的介紹了OpenGL及MFC的建
24、?;A(chǔ),分析了OpenGL的渲染管道,MFC中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法。</p><p> ?。猴w行訓(xùn)練系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)。首先對(duì)系統(tǒng)的設(shè)計(jì)展開介紹,用結(jié)構(gòu)圖表面系統(tǒng)的實(shí)現(xiàn)的步驟,闡述了系統(tǒng)的模型導(dǎo)入,關(guān)于矩陣的變換,所有變換都在三維空間中定義。要完成一次平移,需要引用平移子程序且設(shè)定三維平移向量。在旋轉(zhuǎn)函數(shù)中需指定經(jīng)過坐標(biāo)系原點(diǎn)的旋轉(zhuǎn)軸
25、的角度和方向。以及對(duì)系統(tǒng)中場(chǎng)景繪制和渲染,使它看起來更真實(shí)。</p><p> 第四章: 在導(dǎo)入飛機(jī)模型后,使用鍵盤操作控制模型,運(yùn)行系統(tǒng)得到很好的演示效果。</p><p> 第二章 基于OpenGL+MFC的建?;A(chǔ)</p><p> 2.1 OpenGL的概念</p><p> OpenGL? 是行業(yè)領(lǐng)域中最為廣泛接納的 2D/
26、3D 圖形 API, 其自誕生至今已催生了各種計(jì)算機(jī)平臺(tái)及設(shè)備上的數(shù)千優(yōu)秀應(yīng)用程序。OpenGL? 是獨(dú)立于視窗操作系統(tǒng)或其它操作系統(tǒng)的,亦是網(wǎng)絡(luò)透明的。在包含CAD、內(nèi)容創(chuàng)作、能源、娛樂、游戲開發(fā)、制造業(yè)、制藥業(yè)及虛擬現(xiàn)實(shí)等行業(yè)領(lǐng)域中,OpenGL? 幫助程序員實(shí)現(xiàn)在 PC、工作站、超級(jí)計(jì)算機(jī)等硬件設(shè)備上的高性能、極具沖擊力的高視覺表現(xiàn)力圖形處理軟件的開發(fā)。</p><p> OpenGL的前身是SGI公司為
27、其圖形工作站開發(fā)的IRIS GL。IRIS GL是一個(gè)工業(yè)標(biāo)準(zhǔn)的3D圖形軟件接口,功能雖然強(qiáng)大但是移植性不好,于是SGI公司便在IRIS GL的基礎(chǔ)上開發(fā)了OpenGL。OpenGL的英文全稱是“Open Graphics Library”,顧名思義,OpenGL便是“開放的圖形程序接口”。雖然DirectX在家用市場(chǎng)全面領(lǐng)先,但在專業(yè)高端繪圖領(lǐng)域,OpenGL是不能被取代的主角。 </p><p> 在Ope
28、nGL的基礎(chǔ)上還有Open Inventor、Cosmo3D、Optimizer等多種高級(jí)圖形庫,適應(yīng)不同應(yīng)用。其中,Open Inventor應(yīng)用最為廣泛。該軟件是基于OpenGL面向?qū)ο蟮墓ぞ甙?,提供?chuàng)建交互式3D圖形應(yīng)用程序的對(duì)象和方法,提供了預(yù)定義的對(duì)象和用于交互的事件處理模塊,創(chuàng)建和編輯3D場(chǎng)景的高級(jí)應(yīng)用程序單元,有打印對(duì)象和用其它圖形格式交換數(shù)據(jù)的能力。OpenGL的發(fā)展一直處于一種較為遲緩的態(tài)勢(shì),每次版本的提高新增的技術(shù)
29、很少,大多只是對(duì)其中部分做出修改和完善。1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。1995年OpenGL的1.1版本面市,該版本比1.0的性能有許多提高,并加入了一些新的功能。其中包括改進(jìn)打印機(jī)支持,在增強(qiáng)元文件中包含OpenGL的調(diào)用,頂點(diǎn)數(shù)組的新特性,提高頂點(diǎn)位置、法線、
30、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識(shí)的傳輸速度,引入了新的紋理特性等等。OpenGL 1.5又新增了“Ope</p><p> 2.2 OpenGL的發(fā)展歷程</p><p> 1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。
31、</p><p> 1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。包括提高頂點(diǎn)位置、法線、顏色、色彩指數(shù)、紋理坐標(biāo)、多邊形邊緣標(biāo)識(shí)的傳輸速度,引入了新的紋理特性等等。</p><p> 1997年,Windows 95下3D游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個(gè)功能強(qiáng)大、兼容性好的3D圖形接口,而當(dāng)時(shí)微軟公司自己的3D圖形接口DirectX
32、 3.0功能卻是很糟糕。因而以制作《雷神之錘》等經(jīng)典3D射擊游戲而著名的id公司同其它一些游戲開發(fā)公司一同強(qiáng)烈要求微軟在Windows 95中加入對(duì)OpenGL的支持。微軟公司最終在Windows 95的OSR2版和后來的Windows 版本中加入了對(duì)OpenGL的支持。這樣,不但許多支持OpenGL的電腦3D游戲得到廣泛應(yīng)用,而且許多在3D圖形設(shè)計(jì)軟件也可以運(yùn)用支持OpenGL標(biāo)準(zhǔn)的3D加速卡,大大提高其3D圖形的處理速度。2003
33、年的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月,OpenGL2.0版本發(fā)布OpenGL 2.0標(biāo)準(zhǔn)的主要制訂者并非原來的SGI,而是逐漸在AR
34、B中占據(jù)主動(dòng)地位的3Dlabs。OpenGL12.0支持OpenGL Shading Language、新的shader擴(kuò)展特性以及其他多項(xiàng)增強(qiáng)特性。</p><p> 2008年8月初Khronos工作組在Siggraph 2008大會(huì)上宣布了OpenGL 3.0圖形接口規(guī)范,GLSL1.30 shader語言和其他新增功能將再次未來開放3D接口發(fā)展指明方向。</p><p> Op
35、enGL 3.0 API開發(fā)代號(hào)為Longs Peak,和以往一樣,OpenGL 3.0仍然作為一個(gè)開放性和跨平臺(tái)的3D圖形接口標(biāo)準(zhǔn),在Shader語言盛行的今天,OGL3.0增加了新版本的shader語言:GLSL 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。同時(shí),OGL3.0還引入了一些新的功能,例如頂點(diǎn)矩陣對(duì)象,全幀緩存對(duì)象功能,32bit浮點(diǎn)紋理和渲染緩存,基于阻塞隊(duì)列的條件渲染,緊湊行半浮點(diǎn)頂點(diǎn)和像素?cái)?shù)據(jù),四個(gè)新壓縮機(jī)制等
36、等。</p><p> 2009年3月又公布了升級(jí)版新規(guī)范OpenGL 3.1,也是這套跨平臺(tái)免費(fèi)API有史以來的第九次更新。OpenGL 3.1將此前引入的OpenGL著色語言“GLSL”從1.30版升級(jí)到了1.40版,通過改進(jìn)程序增強(qiáng)了對(duì)最新可編程圖形硬件的訪問,還有更高效的頂點(diǎn)處理、擴(kuò)展的紋理功能、更彈性的緩沖管理等等。寬泛地講,OpenGL 3.1在3.0版的基礎(chǔ)上對(duì)整個(gè)API模型體系進(jìn)行了簡化,可大幅
37、提高軟件開發(fā)效率。2009年8月Khronos小組發(fā)布了OpenGL 3.2,這是一年以來OpenGL進(jìn)行的第三次重要升級(jí)。該版本仍然延續(xù)了OpenGL發(fā)展的方向讓圖形程序開發(fā)者能在多種操作系統(tǒng)和平臺(tái)下更好的利用新的GPU功能。OpenGL3.2版本提升了性能表現(xiàn)、改進(jìn)了視覺質(zhì)量、提高了幾何圖形處理速度,而且使Direct3D程序更容易移植為OpenGL。除OpenGL之外,Khronos還將其開發(fā)的其它標(biāo)準(zhǔn)進(jìn)行了協(xié)調(diào)改進(jìn),以求可以在更
38、廣泛的領(lǐng)域提供強(qiáng)大的圖形功能和計(jì)算生態(tài)系統(tǒng),這些標(biāo)準(zhǔn)包括用于并行計(jì)算的OpenCL、用于移動(dòng)3D圖形開發(fā)的OpenGL ES和用于網(wǎng)絡(luò)3D開發(fā)的WebGL。</p><p> Khronos旗下的OpenGL ARB(Architecture Review Board)工作組推出了GLSL 1.5OpenGLShading Language(OpenGL著色語言)的升級(jí)版,以及在OpenGL3.2框架下推出了兩
39、個(gè)新功能,可以讓開發(fā)者在開發(fā)新程序時(shí)能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會(huì)提供與舊版OpenGL之間的兼容性。</p><p> 2.3 OpenGL的渲染管道 </p><p> 大部分OpenGL的實(shí)現(xiàn)都有一個(gè)的相類似的操作順序,一系列處理階段稱為OpenGL渲染管道。這個(gè)順序(如下圖所示),對(duì)OpenGL的實(shí)現(xiàn)來說不是一套嚴(yán)格的規(guī)則,但是對(duì)我們了解Op
40、enGL將做什么有很好的幫助。</p><p> 下面的圖表顯示了一條福特工廠裝配流水線的過程,這就是OpenGL處理數(shù)據(jù)的過程。幾何數(shù)據(jù)(頂點(diǎn)、線、多邊形)跟隨著這些路徑通過這些代表求值程序和每一個(gè)頂點(diǎn)操作的盒子,而像素?cái)?shù)據(jù)(像素、圖像、位圖)的部分加工處理過程有些不同。在將最后的像素?cái)?shù)據(jù)寫到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過最后相同的步驟(光柵化和碎片操作)。</p><p> 圖2
41、.1 OpenGL處理數(shù)據(jù)流程</p><p> 現(xiàn)在可以看到OpenGL渲染管道中關(guān)鍵步驟的更加詳細(xì)的信息。</p><p><b> 2.3.1顯示列表</b></p><p> 所有數(shù)據(jù),無論是幾何描述或像素,都要被保存在一個(gè)顯示列表中以備用。(如果要將數(shù)據(jù)保留在顯示列表中,就要馬上處理這些數(shù)據(jù),這就是立即模式)。一旦顯示列表被執(zhí)行
42、,保留數(shù)據(jù)將從顯示列表中發(fā)送出去,就像在立即模式下被發(fā)送一樣。</p><p><b> 2.3.2求值程序</b></p><p> 所有幾何元素最后都要用頂點(diǎn)來描述。量化曲線和曲面可以用控制點(diǎn)和多項(xiàng)式函數(shù)(稱為基礎(chǔ)函數(shù))來初始描述。求值程序提供了一種方法可以從控制點(diǎn)來表示曲面。這個(gè)方法是多項(xiàng)式映射,它能夠從控制點(diǎn)產(chǎn)生曲面法線、材質(zhì)坐標(biāo)、顏色、空間坐標(biāo)值。<
43、;/p><p> 2.3.3基于頂點(diǎn)的操作</p><p> 對(duì)于頂點(diǎn)數(shù)據(jù),下一步就是每一個(gè)頂點(diǎn)的操作步驟,它將這些頂點(diǎn)轉(zhuǎn)化程原始圖元。一些頂點(diǎn)數(shù)據(jù)(例如空間坐標(biāo))是用4x4的浮點(diǎn)矩陣轉(zhuǎn)換來的??臻g坐標(biāo)是從3D世界上的一個(gè)點(diǎn)映射到你屏幕上的一個(gè)點(diǎn)。</p><p> 假如使用了更高級(jí)的屬性,這個(gè)步驟甚至更加復(fù)雜。假如使用了紋理,紋理坐標(biāo)將要產(chǎn)生并轉(zhuǎn)換。假如光照效果
44、開啟,光照效果將使用轉(zhuǎn)換過的頂點(diǎn)、曲面法線、光源位置、材質(zhì)屬性、其他光源的信息進(jìn)行計(jì)算,產(chǎn)生一個(gè)顏色值。</p><p><b> 2.3.4初步組裝</b></p><p> 裁剪,一個(gè)初步組裝最主要的部分,是將可視空間外的部分幾何元素消除。點(diǎn)裁剪只是簡單的忽略或刪除該點(diǎn);線或多邊形裁剪將會(huì)增加一些附加的點(diǎn),當(dāng)然這依賴于怎么裁剪。</p><
45、p> 在有些情況下,這是隨著透視處理發(fā)生的,它使遠(yuǎn)處的幾何物體看起來更小一些。然后是視點(diǎn)和景深(z坐標(biāo))處理。假如淘汰功能是打開的,且是多邊形元素,它有可能通過淘汰監(jiān)測(cè)而被抑制。根據(jù)多邊形模式,一個(gè)多邊形有可能被畫成點(diǎn)或線。</p><p> 這個(gè)步驟的結(jié)果是用相關(guān)的顏色、景深、有時(shí)還有紋理坐標(biāo)值和輔助線完成幾何元素的轉(zhuǎn)換和裁剪處理,為光柵化做準(zhǔn)備。</p><p><b&
46、gt; 2.3.5像素操作</b></p><p> 在幾何數(shù)據(jù)通過OpenGL渲染管道的過程中,像素?cái)?shù)據(jù)走的另外一條不同的路徑。像素從系統(tǒng)內(nèi)存的一個(gè)數(shù)組中首先用其中一種格式解包到適當(dāng)數(shù)量的組件中。然后數(shù)據(jù)將被縮放、偏離,和被像素表處理。結(jié)果被匯總?cè)缓髮懭爰y理內(nèi)存或送入光柵化步驟。</p><p> 假如像素?cái)?shù)據(jù)是用幀緩存中讀取的,像素轉(zhuǎn)換操作(縮放、偏離、映射、clam
47、ping)將被執(zhí)行。然后這些結(jié)果將被打包成適當(dāng)?shù)母袷街匦路祷氐较到y(tǒng)內(nèi)存的一個(gè)數(shù)組中。</p><p> 這兒有一些特殊的像素拷貝操作,用于一個(gè)幀緩存中拷貝數(shù)據(jù)到另外一個(gè)幀緩存或紋理內(nèi)存。整個(gè)像素傳輸操作可以在數(shù)據(jù)寫到紋理內(nèi)存或?qū)懟氐綆彺嬷兄巴ㄟ^一條單獨(dú)的路徑進(jìn)行。</p><p><b> 2.3.6紋理裝配</b></p><p>
48、 一個(gè)OpenGL程序也許希望能夠?qū)D像貼到幾何物體上去,使它看起來更加真實(shí)。假如使用了很多紋理貼圖,將它們放到紋理對(duì)象中是個(gè)明智的選擇,因?yàn)槟隳軌蚋菀椎那袚Q它們。</p><p> 一些OpenGL實(shí)現(xiàn)也許有專用的方法用于加速紋理貼圖的性能。這兒也許有專用的、高性能的紋理內(nèi)存。假如這個(gè)內(nèi)存是存在的,紋理對(duì)象將優(yōu)先使用這種有限的且非常有用的資源。</p><p><b>
49、光柵化</b></p><p> 光柵化是將幾何物體和像素?cái)?shù)據(jù)轉(zhuǎn)換成片斷的轉(zhuǎn)換器。每一個(gè)片斷塊對(duì)應(yīng)一個(gè)幀緩存中的像素。線和多邊形點(diǎn)、線寬、點(diǎn)大小、陰影模型、反走樣的平均計(jì)算都被綜合考慮,與頂點(diǎn)被連接成線或用于填充多邊形的點(diǎn)都被計(jì)算出來。每一個(gè)片斷塊的顏色和景深值都被賦值。</p><p> 2.4 MFC的概述</p><p> MFC是一個(gè)編程框
50、架,面前最新版本為10.0。MFC (Microsoft Foundation Class Library) 中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立Windows下的應(yīng)用程序,這是一種相對(duì)SDK來說更為簡單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Microsoft Visual C+
51、+提供了相應(yīng)的工具來完成這個(gè)工作:AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。</p><p><b> 2.5MFC的特點(diǎn)</b></p><p> MFC (Microsoft Foundation Class
52、 Library)中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立Windows下的應(yīng)用程序,這是一種相對(duì)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.5.1封裝</b></p><p> 構(gòu)成MFC框架的是MFC類庫。MFC類庫是C++類庫。這些類或者封裝了Win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了OLE特性,或者封裝了
54、ODBC和DAO數(shù)據(jù)訪問的功能,等等,分述如下。 </p><p> ?。?)對(duì)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++ window ob
55、ject的成員函數(shù)內(nèi),后者的成員變量m_hWnd就是前者的窗口句柄。 </p><p> ?。?)對(duì)應(yīng)用程序概念的封裝 </p><p> 使用SDK編寫Windows應(yīng)用程序時(shí),總要定義窗口過程,登記Windows Class,創(chuàng)建窗口,等等。MFC把許多類似的處理封裝起來,替程序員完成這些工作。另外,MFC提出了以文檔-視圖為中心的編程模式,MFC類庫封裝了對(duì)它的支持。文檔是用戶操作
56、的數(shù)據(jù)對(duì)象,視圖是數(shù)據(jù)操作的窗口,用戶通過它處理、查看數(shù)據(jù)。</p><p> ?。?)對(duì)COM/OLE特性的封裝 </p><p> OLE建立在COM模型之上,由于支持OLE的應(yīng)用程序必須實(shí)現(xiàn)一系列的接口(Interface),因而相當(dāng)繁瑣。MFC的OLE類封裝了OLE API大量的復(fù)雜工作,這些類提供了實(shí)現(xiàn)OLE的更高級(jí)接口。 </p><p> ?。?)對(duì)
57、ODBC功能的封裝 </p><p> 以少量的能提供與ODBC之間更高級(jí)接口的C++類,封裝了ODBC API的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫編程模式。 </p><p><b> 2.5.2繼承</b></p><p> 首先,MFC抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是CObject和
58、CCmdTarget。CObject是MFC的根類,絕大多數(shù)MFC類是其派生的,包括CCmdTarget。CObject 實(shí)現(xiàn)了一些重要的特性,包括動(dòng)態(tài)類信息、動(dòng)態(tài)創(chuàng)建、對(duì)象序列化、對(duì)程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget派生。 </p><
59、;p> 針對(duì)每種不同的對(duì)象,MFC都設(shè)計(jì)了一組類對(duì)這些對(duì)象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對(duì)象包括以下種類:窗口對(duì)象,基類是CWnd;應(yīng)用程序?qū)ο螅愂荂winThread;文檔對(duì)象,基類是Cdocument,等等。 </p><p> 程序員將結(jié)合自己的實(shí)際,從適當(dāng)?shù)腗FC類中派生出自己的類,實(shí)現(xiàn)特定的功能,達(dá)到自己的編程目的。 </p><p&g
60、t; 2.5.3虛擬函數(shù)和動(dòng)態(tài)約束</p><p> MFC以“C++”為基礎(chǔ),自然支持虛擬函數(shù)和動(dòng)態(tài)約束。但是作為一個(gè)編程框架,有一個(gè)問題必須解決:如果僅僅通過虛擬函數(shù)來支持動(dòng)態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝 Windows窗口對(duì)象時(shí),每一條Windows消息對(duì)應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于
61、是,MFC建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動(dòng)態(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)幕,讓讀者對(duì)MFC的編程接口有清晰的理解。 <
62、/p><p> 2.6 MFC的編程框架</p><p> 2.6.1 MFC的宏觀框架體系</p><p> MFC實(shí)現(xiàn)了對(duì)應(yīng)用程序概念的封裝,把類、類的繼承、動(dòng)態(tài)約束、類的關(guān)系和相互作用等封裝起來。這樣封裝的結(jié)果對(duì)程序員來說,是一套開發(fā)模板(或者說模式)。針對(duì)不同的應(yīng)用和目的,程序員采用不同的模板。例如,SDI應(yīng)用程序的模板,MDI應(yīng)用程序的模板,規(guī)則DLL應(yīng)
63、用程序的模板,擴(kuò)展DLL應(yīng)用程序的模板,OLE/ACTIVEX應(yīng)用程序的模板,等等。 </p><p> 這些模板都采用了以文檔-視為中心的思想,每一個(gè)模板都包含一組特定的類。典型的MDI應(yīng)用程序的構(gòu)成將在下一節(jié)具體討論。 </p><p> 為了支持對(duì)應(yīng)用程序概念的封裝,MFC內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行
64、處理。又如,為了實(shí)現(xiàn)對(duì)DLL編程的支持和多線程編程的支持,MFC內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內(nèi)部處理對(duì)程序員來說是透明的,但是,懂得和理解MFC內(nèi)部機(jī)制有助于寫出功能靈活而強(qiáng)大的程序。</p><p> 總之,MFC封裝了Win32 API,OLE API,ODBC API等底層函數(shù)的功能,并提供更高一層的接口,簡化了Windows編程。同時(shí),MFC支持對(duì)底層
65、API的直接調(diào)用。 </p><p> MFC提供了一個(gè)Windows應(yīng)用程序開發(fā)模式,對(duì)程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等。框架或者由其本身處理事件,不依賴程序員的代碼;或者調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。 </p><p> MFC是C++類庫,程序員就是通過使用、繼承和擴(kuò)展適當(dāng)?shù)念悂韺?shí)現(xiàn)特定的目的。
66、例如,繼承時(shí),應(yīng)用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是C++對(duì)繼承的支持,對(duì)虛擬函數(shù)的支持,以及MFC實(shí)現(xiàn)的消息映射機(jī)制。 </p><p> 2.7MDI應(yīng)用程序構(gòu)成</p><p> 用AppWizard產(chǎn)生一個(gè)MDI工程t(無OLE等支持),AppWizard創(chuàng)建了一系列文件,構(gòu)成了一個(gè)應(yīng)用程序框架。這些文件分四類:頭文件(.h),實(shí)現(xiàn)
67、文件(.cpp),資源文件(.rc),模塊定義文件(.def),等。 </p><p> 2.7.1構(gòu)成應(yīng)用程序?qū)ο?lt;/p><p> 下圖解釋了該應(yīng)用程序的結(jié)構(gòu),箭頭表示信息流向。 </p><p> 圖2.2 應(yīng)用程序的結(jié)構(gòu)</p><p> 從CWinApp、CDocument、CView、CMDIFrameWnd、CMDICh
68、ildWnd類對(duì)應(yīng)地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο?、文檔對(duì)象、視對(duì)象、主框架窗口對(duì)象和文檔邊框窗口對(duì)象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對(duì)這些類或者對(duì)象解釋如下。 </p><p><b> ?。?)應(yīng)用程序 </b></p><p> 應(yīng)用程序類派生于CWin
69、App?;诳蚣艿膽?yīng)用程序必須有且只有一個(gè)應(yīng)用程序?qū)ο?,它?fù)責(zé)應(yīng)用程序的初始化、運(yùn)行和結(jié)束。 </p><p><b> ?。?)邊框窗口類 </b></p><p> 如果是SDI應(yīng)用程序,從CFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含視窗口;如果是MDI應(yīng)用程序,從CMDIFrameWnd類派生邊框窗口類,邊框窗口的客戶
70、子窗口(MDIClient)直接包含文檔邊框窗口。 </p><p> 如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加CToolBar和CStatusBar類型的成員變量,以及在一個(gè)OnCreate消息處理函數(shù)中初始化這兩個(gè)控制窗口。 </p><p> 邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預(yù)覽
71、)。 </p><p> ?。?)文檔邊框窗口類 </p><p> 文檔邊框窗口類從CMDIChildWnd類派生,MDI應(yīng)用程序使用文檔邊框窗口來包含視窗口。 </p><p><b> (4)文檔類 </b></p><p> 文檔類從CDocument類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實(shí)現(xiàn)的
72、。視窗口通過文檔對(duì)象來訪問和更新數(shù)據(jù)。 </p><p><b> ?。?)視類 </b></p><p> 視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對(duì)文檔的操作。 </p><p><b> ?。?)文檔模板類 </b></p
73、><p> 文檔模板類一般不需要派生。MDI應(yīng)用程序使用多文檔模板類CMultiDocTemplate;SDI應(yīng)用程序使用單文檔模板類CSingleDocTemplate。 </p><p> 應(yīng)用程序通過文檔模板類對(duì)象來管理上述對(duì)象(應(yīng)用程序?qū)ο?、文檔對(duì)象、主邊框窗口對(duì)象、文檔邊框窗口對(duì)象、視對(duì)象)的創(chuàng)建。 </p><p> 2.7.2構(gòu)成應(yīng)用程序的對(duì)象之間的
74、關(guān)系</p><p> 圖2.3 MFC類的繼承和派生關(guān)系</p><p> 用圖的形式可直觀地表示所涉及的MFC類的繼承或者派生關(guān)系,如圖所示意。 圖所示的類都是從CObject類派生出來的;所有處理消息的類都是從CCmdTarget類派生的。如果是多文檔應(yīng)用程序,文檔模板使用CMultiDocTemplae,主框架窗口從CMdiFarmeWnd派生,它包含工具條、狀態(tài)欄和文檔框架窗
75、口。文檔框架窗口從CMdiChildWnd派生,文檔框架窗口包含視,視從CView或其派生類派生。</p><p> 2.7.3構(gòu)成應(yīng)用程序的文件</p><p> 通過上述分析,可知AppWizard產(chǎn)生的MDI框架程序的內(nèi)容,所定義和實(shí)現(xiàn)的類。下面,從文件的角度來考察AppWizard生成了源碼和作用。表2.1列出了AppWizard所生成的頭文件,表2.1列出了了AppWizar
76、d所生成的實(shí)現(xiàn)文件及其對(duì)頭文件的包含關(guān)系。 </p><p> 表2.1 AppWizard所生成的頭文件 </p><p> 表2.2 AppWizard所生成的實(shí)現(xiàn)文件 </p><p> 從表2.2中的包含關(guān)系一欄可以看出: </p><p> CTApp 的實(shí)現(xiàn)用到所有的用戶定義對(duì)象,包含了他們的定義;CView 的實(shí)現(xiàn)用到C
77、Tdoc;其他對(duì)象的實(shí)現(xiàn)只涉及自己的定義; </p><p> 當(dāng)然,如果增加其他操作,引用其他對(duì)象,則要包含相應(yīng)的類的定義文件。</p><p> 2.8 基于OpenGL+MFC的三維模擬的編程環(huán)境配置</p><p><b> 1.創(chuàng)建MFC項(xiàng)目</b></p><p> ?、賱?chuàng)建項(xiàng)目文件。選擇File|Ne
78、w菜單項(xiàng),新建一個(gè)基于對(duì)話框的項(xiàng)目文件MyDlgOpenGL;</p><p> ?、?修改對(duì)話框模板。刪除對(duì)話框中的靜態(tài)文本,調(diào)整控件的位置;</p><p> ?、厶砑覱penGL開發(fā)庫文件到項(xiàng)目</p><p> 在編譯程序的時(shí)候選擇Project|Setting菜單,在Link標(biāo)簽中的Object/library modules編輯框中輸入“opengl3
79、2.lib, glut32.lib ,glu32.lib,glaux.lib”;</p><p> ?、軇?chuàng)建新類,添加消息映射。選擇View|ClassWizard菜單項(xiàng),打開MFC對(duì)話框,在Add Class之中選擇New,以便添加一個(gè)新類COpenGL,且該類的基類選擇generic CWnd;最后利用MFC ClassWizard為COpenGL類添加消息WM_CREATE,WM_PAINT的映射。<
80、/p><p> 2. 配置基于OpenGL+MFC的開發(fā)環(huán)境</p><p> ?、賹lu.dll,glu32.dll,glut.dll,glut32.dll,opengl32.dll文件拷貝到操作系統(tǒng)WINNT/System32目錄下。</p><p> ?、趯l.h,glaux.h,glu.h,glut.h拷貝到Microsoft Visual Studio/
81、VC98/Include/GL目錄中中。</p><p> ?、蹖laux.lib,glu32.lib,glut32.lib,opengl32.lib拷貝到Microsoft Visual Studio/VC98/Lib目錄中。</p><p> 3.初始化OpenGL:(設(shè)置像素格式、創(chuàng)建OpenGL dc、rc,設(shè)置OpenGL視口變換),</p><p>
82、 ?、僭O(shè)置像素格式:為CMyTestView 類添加成員函數(shù) BOOL bSetupPixelFormat(void),用于與OpenGL 相關(guān)的設(shè)置 </p><p> /*定 義 像 素 存 儲(chǔ) 格 式 */ </p><p> PIXELFORMATDESCRIPTOR pfd = { </p><p> sizeof(PIXELFORMATD
83、ESCRIPTOR), // pfd結(jié)構(gòu)的大小 </p><p> 1, // 版本號(hào) </p><p> PFD_DRAW_TO_WINDOW | // 支持在窗口中繪圖 </p><p> PFD_SUPPORT_OPENGL |
84、// 支持 OpenGL </p><p> PFD_TYPE_RGBA, // RGBA 顏色模式 </p><p> 24, // 24 位顏色深度 </p><p> 0, 0, 0, 0, 0, 0, // 忽略顏色位
85、 </p><p> 0, // 沒有非透明度緩存 </p><p> 0, // 忽略移位位 </p><p> 0, // 無累加緩存 </p><
86、;p> 0, 0, 0, 0, // 忽略累加位 </p><p> 32, // 32 位深度緩存 </p><p> 0, // 無模板緩存 </p><p> 0,
87、 // 無輔助緩存 </p><p> PFD_MAIN_PLANE, // 主層 </p><p> 0, // 保留 </p><p> 0, 0, 0
88、 // 忽略層 , 可見性和損毀掩模 </p><p><b> }; </b></p><p> int pixelformat; </p><p> if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 ) </p&
89、gt;<p><b> { </b></p><p> MessageBox("ChoosePixelFormat failed"); </p><p> return FALSE; </p><p><b> } </b></p><p> if (Se
90、tPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) </p><p><b> { </b></p><p> MessageBox("SetPixelFormat failed"); </p><p> return FALSE;
91、 </p><p><b> } </b></p><p> return TRUE; </p><p> ?、诔跏蓟瘎?chuàng)建OpenGL RC:hrc = wglCreateContext(m_pDC->GetSafeHdc()); </p><p> wglMakeCurrent(m_pDC->GetS
92、afeHdc(), hrc); </p><p> 并 添加WM_CREATE 消息處理函數(shù),然后在 OnCreate函數(shù)中進(jìn)行調(diào)用: </p><p> // TODO: Add your specialized creation code here </p><p><b> Init(); </b></p><p
93、> ?、鄢跏蓟墨@取dc:m_pDC = new CClientDC(this); </p><p> ASSERT(m_pDC != NULL); </p><p> ?、茉O(shè)置OpenGL視錐體即投影變換矩陣</p><p> glMatrixMode(GL_PROJECTION); //在修改前重設(shè)坐標(biāo)系 </p><p>
94、glLoadIdentity(); </p><p><b> ?、菰O(shè)置視口變換:</b></p><p> // Set the viewport視口 to be the entire window </p><p> glViewport(0, 0, w, h); </p><p> gluPerspecti
95、ve(45,ratio,1,1000);</p><p> ?、拊O(shè)置OpenGL模型變換</p><p> glMatrixMode(GL_MODELVIEW); </p><p> glLoadIdentity(); </p><p><b> 實(shí)現(xiàn)應(yīng)用程序邏輯:</b></p><p>
96、<b> ①首先添加結(jié)構(gòu)網(wǎng)</b></p><p> struct Mesh</p><p><b> {</b></p><p> int m_materialIndex;</p><p> int m_numTriangles;</p><p> int *m
97、_pTriangleIndices;</p><p><b> };</b></p><p> ?、谌缓笤偬砑尤墙Y(jié)構(gòu)</p><p> struct Triangle</p><p><b> {</b></p><p> GLfloat m_vertexNorma
98、ls[3][3];</p><p> GLfloat m_s[3], m_t[3];</p><p> int m_vertexIndices[3];</p><p><b> };</b></p><p><b> ?、圻M(jìn)而添加結(jié)構(gòu)頂點(diǎn)</b></p><p> s
99、truct Vertex</p><p><b> {</b></p><p> char m_boneID;// for skeletal animation</p><p> GLfloat m_location[3];</p><p><b> };</b></p>&
100、lt;p> 5. 清理工作:(析構(gòu)函數(shù)中釋放dc,rc指針)</p><p> void CMyRainView::OnDestroy() </p><p><b> {</b></p><p> CView::OnDestroy();</p><p><b> } ;</b><
101、;/p><p> 第三章飛行訓(xùn)練系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)</p><p><b> 3.1 系統(tǒng)的設(shè)計(jì)</b></p><p> 任何復(fù)雜的幾何結(jié)構(gòu)都是由點(diǎn)、線、多邊形等基本圖原構(gòu)成。OpenGL 的基本庫提供了繪制各種基本類型的3D 圖元函數(shù)。而OpenGL 工具庫(glu32. lib) 提供了用來形成錐體、柱體,盤狀體和球體的鑲嵌工具以及渲染它
102、們的功能。這些形狀函數(shù)使用了一個(gè)名為quadric (二次曲面) 的專門鑲嵌工具。利用這些函數(shù)可以建立飛機(jī)和地面模型[6]。本系統(tǒng)設(shè)計(jì)的結(jié)構(gòu)如下圖。</p><p> 系統(tǒng)由用戶層、處理層和數(shù)據(jù)層三部分組成的,用戶層就是用戶通過鼠標(biāo)或鍵盤實(shí)現(xiàn)操作系統(tǒng)。處理層包含了模型組織管理、模型渲染及模型操作。模型的組織和管理是控制模型的輸入和輸出,而模型的操作則主要是通過矩陣變換的運(yùn)算來實(shí)現(xiàn)的。</p>&l
103、t;p><b> 圖3.1 系統(tǒng)結(jié)構(gòu)</b></p><p> 3.1.1系統(tǒng)結(jié)構(gòu)的類</p><p> 本系統(tǒng)中用到以下幾個(gè)類:</p><p> CWnd:窗口,它是大多數(shù)“看得見的東西”的父類(Windows里幾乎所有看得見的東西都是一個(gè)窗口,大窗口里有許多小窗口),比如視圖CView、框架窗口CFrameWnd、工具條CT
104、oolBar、對(duì)話框CDialog、按鈕CButton,etc;一個(gè)例外是菜單(CMenu)不是從窗口派生的。</p><p> CDocument文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫)。</p><p> CView視圖,負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(
105、如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啟動(dòng)它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。</p><p> CDialog對(duì)話框。</p><p> CWinApp應(yīng)用程序類。似于C中的main函數(shù),是程序執(zhí)行的入口和管理者,負(fù)責(zé)程序建立、消滅,主窗口和文檔模板的建立。最常用函數(shù)InitInsta
106、nce():初始化。</p><p> 圖3.2 系統(tǒng)結(jié)構(gòu)CView類圖</p><p> 系統(tǒng)使用下面的結(jié)構(gòu)體存儲(chǔ)導(dǎo)入的模型的三維實(shí)體數(shù)據(jù)</p><p> Struct tVect{</p><p> loat x,Y,z;</p><p> }; 用來保存模型中頂點(diǎn)的3D坐標(biāo)</p>&
107、lt;p> struct ModelContext</p><p><b> {</b></p><p> int facetCount; //面的數(shù)量</p><p> int triangleFlag;</p><p> Vertex vertexList
108、[VERTEX_MAX];//模型中的頂點(diǎn)列表</p><p> int vertexCount;</p><p> Vertex lineList[LINE_MAX];//線中的頂點(diǎn)數(shù)組</p><p> int lineCount;//頂點(diǎn)數(shù)量</p><p> Vertex lineStripList[LI
109、NE_STRIP_MAX]; </p><p> int lineStripCount;</p><p> int edgeList[EDGE_MAX][2];</p><p> int edgeCount;</p><p> Vertex objVertexList[OBJ_VERTEX_MAX]; //OBJ文件中的頂點(diǎn)&l
110、t;/p><p> int ovCount;</p><p> int onCount;</p><p> ColorStruct colorList[COLOR_MAX];//模型中的顏色列表</p><p> int colorCount;</p><p><b> //模型中的邊界盒</
111、b></p><p> GLfloat boundBoxLeft, boundBoxBottom, boundBoxNear;</p><p> GLfloat boundBoxRight, boundBoxTop, boundBoxFar;</p><p> GLdouble rotX, rotY;</p><p> GLdo
112、uble scaleObj;</p><p> GLdouble rotMat[16];</p><p> GLdouble windowWidth, windowHeight;</p><p> GLdouble minimumScale;</p><p> int haveNormals;</p><p>
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 3d飛行訓(xùn)練系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 3d動(dòng)畫畢業(yè)論文
- 畢業(yè)論文--3d綠色機(jī)房設(shè)計(jì)
- 基于torque游戲引擎的3d游戲的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文
- 3d游戲設(shè)計(jì) ——音頻處理-畢業(yè)論文
- 3d打印技術(shù)畢業(yè)論文
- 3d動(dòng)畫制作畢業(yè)論文
- 3d室內(nèi)設(shè)計(jì)畢業(yè)論文
- 通用3D飛行仿真平臺(tái)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 3d光立方系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)設(shè)計(jì)】
- 畢業(yè)論文-3d電梯光幕保護(hù)系統(tǒng)
- 畢業(yè)論文-3d電梯光幕保護(hù)系統(tǒng)
- (畢業(yè)論文)3d打印機(jī)畢業(yè)設(shè)計(jì)
- 3d游戲設(shè)計(jì)畢業(yè)論文任務(wù)書
- 3d動(dòng)漫游戲設(shè)計(jì)-場(chǎng)景設(shè)計(jì)---畢業(yè)論文
- 3d家居室內(nèi)效果設(shè)計(jì)畢業(yè)論文
- 3D仿真模擬訓(xùn)練系統(tǒng)軟件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 3d動(dòng)漫游戲設(shè)計(jì)——人物角色設(shè)計(jì)---畢業(yè)論文
- 畢業(yè)論文--3d電影的光學(xué)原理探討
- 3d打印技術(shù)的應(yīng)用畢業(yè)論文
評(píng)論
0/150
提交評(píng)論