基于粒子系統(tǒng)的噴泉模擬畢業(yè)論文_第1頁
已閱讀1頁,還剩36頁未讀 繼續(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>  論文題目: 基于粒子系統(tǒng)的噴泉模擬 </p><p>  系 別: 計(jì)算機(jī)系 </p><p>  專業(yè)年級: </p><p>  學(xué) 號: </

2、p><p>  姓  名: </p><p>  指導(dǎo)教師、職稱: </p><p><b>  年 月 日</b></p><p>  Fountain simulation based on particle system</p><p>&l

3、t;b>  College: </b></p><p>  Specialty and Grade: </p><p><b>  Number: </b></p><p>  Name: </p><p>  Advisor: </p><p

4、>  Submitted time: </p><p><b>  目錄</b></p><p><b>  摘 要1</b></p><p>  Abstract2</p><p><b>  1 緒 論3</b></p>

5、<p>  1.1 研究背景、意義3</p><p>  1.2 國內(nèi)外研究現(xiàn)狀4</p><p>  1.3 本論文的技術(shù)路線5</p><p>  2 基于OpenGL+MFC的建模基礎(chǔ)6</p><p>  2.1 OpenGL概述6</p><p>  2.2 OpenGL渲染管道6&l

6、t;/p><p>  2.2.1 求值器6</p><p>  2.2.2 基于頂點(diǎn)的操作7</p><p>  2.2.3 圖元裝配7</p><p>  2.2.4 像素操作7</p><p>  2.2.5 紋理裝配7</p><p>  2.2.6 光棚化7</p>

7、<p>  2.2.7 片斷操作7</p><p>  2.3 MFC概述8</p><p>  2.3.1 封裝8</p><p>  2.3.2 繼承9</p><p>  2.3.3 虛擬函數(shù)和動(dòng)態(tài)約束9</p><p>  2.3.4 MFC的宏觀框架體系9</p><

8、;p>  2.4 MFC編程框架10</p><p>  2.4.1 構(gòu)成應(yīng)用程序?qū)ο?0</p><p>  2.4.2 構(gòu)成應(yīng)用程序的對象之間的關(guān)系11</p><p>  2.4.3 構(gòu)成應(yīng)用程序的文件11</p><p>  2.5 基于OpenGL+MFC的三維模擬的編程環(huán)境配置13</p><p

9、>  3 粒子系統(tǒng)的原理和關(guān)鍵技術(shù)16</p><p>  3.1 計(jì)算機(jī)圖形學(xué)原理16</p><p>  3.2 粒子系統(tǒng)的理論16</p><p>  3.3 粒子系統(tǒng)的基本模型16</p><p>  3.3.1 粒子的生成17</p><p>  3.3.2 粒子屬性初始化17</p&

10、gt;<p>  3.3.3 粒子的運(yùn)動(dòng)狀態(tài)18</p><p>  3.3.4 粒子的消亡19</p><p>  3.3.5 粒子的繪制19</p><p>  4 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)20</p><p>  4.1 系統(tǒng)的關(guān)鍵技術(shù)分析20</p><p>  4.1.1 噴泉現(xiàn)象的運(yùn)動(dòng)規(guī)律

11、20</p><p>  4.1.2 噴泉現(xiàn)象特征21</p><p>  4.2 系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)21</p><p>  4.2.1 噴泉粒子系統(tǒng)的邏輯視圖21</p><p>  4.2.2 噴泉粒子系統(tǒng)實(shí)現(xiàn)的關(guān)鍵代碼23</p><p>  4.3 模擬結(jié)果28</p><p>

12、;  5 結(jié)論與展望29</p><p>  5.1 全文總結(jié)29</p><p>  5.2 進(jìn)一步展望29</p><p><b>  參考文獻(xiàn)30</b></p><p><b>  致 謝33</b></p><p><b>  摘 要<

13、;/b></p><p>  自然景物的模擬在視景仿真系統(tǒng)、計(jì)算機(jī)游戲、三維動(dòng)畫中等有著廣泛的運(yùn)用。自然景物的模擬也一直是計(jì)算機(jī)圖形學(xué)中的熱門研究課題。然而,大多數(shù)自然景物的外形是隨機(jī)變化的,如:火焰、浪花、河流、瀑布、雨雪、煙霧等,很難用常規(guī)的建模方法及模擬技術(shù)來描述,因此自然景物的模擬也是具有挑戰(zhàn)性的課題。</p><p>  本文在認(rèn)真分析和總結(jié)目前國內(nèi)外噴泉模擬的基礎(chǔ)上,以實(shí)

14、時(shí)性和逼真性為目標(biāo),提出一種基于粒子系統(tǒng)的虛擬噴泉的模擬方法。結(jié)合OpenGL和MFC編程,運(yùn)用物理原理模擬實(shí)現(xiàn)噴泉粒子的運(yùn)動(dòng)軌跡時(shí),結(jié)合等加速運(yùn)動(dòng)來簡化粒子運(yùn)動(dòng)狀態(tài),并采用紋理融合技術(shù)實(shí)現(xiàn)對粒子的繪制。實(shí)驗(yàn)證明該方法實(shí)現(xiàn)簡單,模擬的噴泉效果滿足實(shí)時(shí)性和逼真性的要求。</p><p>  關(guān)鍵詞:粒子系統(tǒng);噴泉模擬;虛擬現(xiàn)實(shí);0penGL</p><p><b>  Abstra

15、ct</b></p><p>  The natural scenery in visual simulation system is simulated, the computer games, 3d animation medium have extensive use of. The natural scenery of simulation has been computer graphics

16、.a hot research topic. However, most of the natural scenery have random change shape, such as flame, spray, rivers, waterfalls, snow, smoke, etc. It is difficult to use conventional modeling method and simulation technol

17、ogy to describe the natural scenery, so the simulation of natural scenery is a challenging task</p><p>  Based on the analysis and summary fountain at home and abroad on the basis of simulation, real-time an

18、d lifelike, particle system was proposed. Combined with OpenGL and physical principle, using MFC programming simulation of particle trajectories fountain, combined acceleration motion to simplify particle movement, and t

19、he realization of particle texture fusion technology. Experiment results show that the method is simple, the fountain of simulation results meet requirement of real-time and life</p><p>  Key words:particle

20、systems, Fountain simulation, Virtual reality, 0penGL </p><p><b>  1 緒 論</b></p><p>  計(jì)算機(jī)圖形學(xué)(Computer Graphics,簡稱CG)是一種使用數(shù)學(xué)算法將二維或三維圖形轉(zhuǎn)化為計(jì)算機(jī)顯示器柵格形式的科學(xué)。簡單地說,計(jì)算機(jī)圖形學(xué)就是研究如何在計(jì)算機(jī)中表示圖形、利用計(jì)算

21、機(jī)進(jìn)行圖形計(jì)算、處理和顯示的相關(guān)原理與算法。1982年,國際標(biāo)準(zhǔn)化組織IS0給出計(jì)算機(jī)圖形學(xué)的定義:研究用計(jì)算機(jī)進(jìn)行數(shù)據(jù)與圖形之間相互轉(zhuǎn)換的方法和技術(shù)。計(jì)算機(jī)圖形學(xué)是運(yùn)用計(jì)算機(jī)產(chǎn)生、存儲(chǔ)、構(gòu)建物體模型的一門學(xué)科[1]。</p><p>  近年來,諸如云彩、瀑布、雨、雪等不規(guī)則模糊物體的模擬越來越成為計(jì)算機(jī)圖形學(xué)中最具挑戰(zhàn)性的研究方向之一,它們的模擬在計(jì)算機(jī)游戲、影視、廣告、視景仿真等各種領(lǐng)域得到了越來越廣泛的應(yīng)

22、用。具有不規(guī)則的幾何外形和內(nèi)在不確定性的不規(guī)則模糊物體,不能用通常的三維建模方法來制作,不同于靜態(tài)景物,它具有產(chǎn)生、發(fā)展和消滅的過程。粒子系統(tǒng)(particle system)是迄今為止模擬不規(guī)則模糊物體最為成功的一種圖形生成算法。</p><p>  噴泉模擬過程是一種非常復(fù)雜的不規(guī)則模糊物體的模擬過程,本文在運(yùn)用物理學(xué)原理模擬實(shí)現(xiàn)噴泉粒子的運(yùn)動(dòng)軌跡時(shí),結(jié)合等加速運(yùn)動(dòng)來簡化粒子運(yùn)動(dòng)狀態(tài),并利用OpenGL的紋理

23、映射和融合該技術(shù)繪制粒子。結(jié)果表明等加速運(yùn)動(dòng)方法使粒子運(yùn)動(dòng)路徑更加簡單,可以獲得好的實(shí)時(shí)性,利用融合渲染粒子的方法也使噴泉模擬效果滿足了虛擬現(xiàn)實(shí)、計(jì)算機(jī)仿真中真實(shí)感的要求。</p><p>  1.1 研究背景、意義</p><p>  虛擬現(xiàn)實(shí)技術(shù)在當(dāng)今計(jì)算機(jī)信息科學(xué)領(lǐng)域中研究的熱門方向之一,虛擬場景是虛擬現(xiàn)實(shí)系統(tǒng)中重要的組成部分,在虛擬場景中模擬生活中的自然景物一直是計(jì)算機(jī)圖形學(xué)領(lǐng)域中

24、研究的內(nèi)容。隨著計(jì)算機(jī)科技的不斷發(fā)展進(jìn)步,計(jì)算機(jī)圖形學(xué)己成為一個(gè)具有巨大潛力的新興產(chǎn)業(yè),對于人們的學(xué)習(xí)、生活以及學(xué)習(xí)領(lǐng)域都產(chǎn)生了重大的影響和推動(dòng)作用。尤其是圖形學(xué)領(lǐng)域中的計(jì)算機(jī)動(dòng)畫目前廣泛應(yīng)用于航空航天、影視廣告、行為模擬、裝演設(shè)計(jì)、虛擬場景等各種領(lǐng)域??梢灶A(yù)見,在未來的信息工業(yè)和產(chǎn)業(yè)中,計(jì)算機(jī)動(dòng)畫將更進(jìn)一步發(fā)揮巨大的作用,占據(jù)重要的地位。</p><p>  近年來,對于自然景物的生成與模擬一直是計(jì)算機(jī)圖形學(xué)和

25、動(dòng)畫研究中的熱門課題。其中的煙火爆炸、云霧閃電、瀑布浪花、飛沙塵埃、花草樹木等景物的模擬更具有挑戰(zhàn)性。這些自然景物因其形狀、形態(tài)隨時(shí)間的推移而動(dòng)態(tài)地、隨機(jī)地發(fā)生變化,很難用常規(guī)的建模方法及模擬技術(shù)來生成。隨機(jī)模型是處理這類問題的一種先進(jìn)的方法,在隨機(jī)模型中首推Fournier的分形算法和Reeves的粒子系統(tǒng)方法[2]。其中粒子系統(tǒng)方法具有良好的隨機(jī)性和動(dòng)態(tài)性,能逼真地模擬動(dòng)態(tài)景物。因此,研究利用粒子系統(tǒng)方法模擬自然景物,有著重要的科學(xué)

26、意義和廣泛的應(yīng)用前景。</p><p>  噴泉是這些景物中具有代表性的動(dòng)態(tài)景物,在風(fēng)景園林、學(xué)校、廣場、生活小區(qū)、公園等工作及休閑娛樂場所皆可看到各種不同的噴泉[3]。因此,在虛擬風(fēng)景園林、虛擬校園、虛擬城市、虛擬公園等大的虛擬場景中,噴泉是一個(gè)風(fēng)景點(diǎn)。粒子系統(tǒng)是最合適在虛擬場景中建立噴泉模型的選擇。</p><p>  論文研究的意義在于粒子系統(tǒng)方法在模擬不規(guī)則動(dòng)態(tài)自然景物的研究領(lǐng)域開

27、辟了很大的發(fā)展空間,自然景物的模擬是計(jì)算機(jī)圖形學(xué)理論研究與實(shí)際應(yīng)用的重點(diǎn)與難點(diǎn);在構(gòu)造這類復(fù)雜物體的幾何模型時(shí)需要大量的有效數(shù)據(jù),而且這些數(shù)據(jù)都是隨機(jī)性,計(jì)算量相當(dāng)大,如何以粒子系統(tǒng)基本算法來構(gòu)造復(fù)雜物體并逼真的對其進(jìn)行實(shí)時(shí)渲染是虛擬現(xiàn)實(shí)技術(shù)研究的新課題。</p><p>  虛擬噴泉技術(shù)在房地產(chǎn)開發(fā)、建筑設(shè)計(jì)、影視制作、游戲設(shè)計(jì),風(fēng)景園林等方面具有非常廣闊的應(yīng)用前景。在虛擬場景中水的效果對增強(qiáng)場景真實(shí)感有十分重

28、要的作用,其中噴泉效果是虛擬場景中常見的畫面,例如風(fēng)景園林的動(dòng)態(tài)噴泉水景,將計(jì)算機(jī)產(chǎn)生的許多奇妙噴泉水景圖像添加到虛擬漫游系統(tǒng)或影視作品中可以大大提高作品的觀賞效果。</p><p>  虛擬噴泉的沉浸性、真實(shí)性以及實(shí)時(shí)性效果是傳統(tǒng)平面效果圖和動(dòng)畫播放所無法達(dá)到的,而應(yīng)用粒子系統(tǒng)實(shí)現(xiàn)噴泉的模擬具有較強(qiáng)的真實(shí)感,能達(dá)到人們對虛擬現(xiàn)實(shí)系統(tǒng)沉浸感的要求,使人能在虛擬場景中有身臨其境的感覺,更具有實(shí)時(shí)性。因此虛擬噴泉技術(shù)

29、在一定程度上會(huì)得到廣泛的應(yīng)用,利用粒子系統(tǒng)實(shí)現(xiàn)噴泉的三維效果在虛擬現(xiàn)實(shí)領(lǐng)域具有一定的研究意義。</p><p>  1.2 國內(nèi)外研究現(xiàn)狀</p><p>  在對于仿真噴泉、瀑布、火焰、樹木、雨、雪、霧等這些生活中常見的自然景物過程中,由于這些景物具有不規(guī)則性,動(dòng)態(tài)性和隨機(jī)性,模擬起來十分的困難,同時(shí)也是虛擬場景中不可缺少的部分。而自然景物的模擬一直是虛擬現(xiàn)實(shí)領(lǐng)域的重要研究內(nèi)容,如何在虛

30、擬場景中真實(shí)的再現(xiàn)生活中的自然景物是極具挑戰(zhàn)性的課題之一。自然景物的模擬一般有兩種方法[4]:</p><p>  一種是基于物理建模技術(shù)的方法?;谖锢斫<夹g(shù)的方法主要是通過對Navier-Stokes(納維埃一斯托克斯,簡稱N—S方程)方程求解,求出流體過斷面時(shí)的平均流速[5]。在基于物理的真實(shí)水流模擬方面,Anderson[6]等人從工程需要出發(fā),基于Navier-Stokes方程準(zhǔn)確描述了水流的形態(tài);而

31、Kass [7]等人則以動(dòng)畫中快速模擬為目標(biāo),通過簡化Navier-Stokes方程較好地模擬了水波:Foster [8]等人運(yùn)用Navier-Stokes方程分別實(shí)現(xiàn)了液體、氣體、流體的模擬。我國的徐迎慶[9]等人從水力學(xué)方程出發(fā),提出了一個(gè)基于物理模型的模擬流水和波浪的方法;陳前華[10]等人基于物理建模方法與隱式曲面造型技術(shù),實(shí)現(xiàn)了滴水漣漪的模擬。這些方法的共同特點(diǎn)是要求解Navier-Stokes方程,或者是簡化后的Navier

32、-Stokes方程,但由于Navicr-Stokes方程組是非線性方程組,很多情況下都難以精確地求出解析解,即使能求出其特解也往往因?yàn)榍蠼庥?jì)算量太大而難以達(dá)到實(shí)時(shí)的要求。</p><p>  另一種是基于粒子系統(tǒng)的方法。自然景物與規(guī)則的幾何物體不同,它們的表面往往包含有豐富的細(xì)節(jié)或具有隨機(jī)變化的形狀,這些細(xì)節(jié)與隨機(jī)變化的形狀很難用傳統(tǒng)的解析曲面來描述。比如說對噴泉、水流、云、霧、煙、雪、火花等自然景物的模擬上,傳

33、統(tǒng)的造型方法具有局限性,而粒子系統(tǒng)的出現(xiàn)卻較好的解決了這一難題。粒子系統(tǒng)能充分體現(xiàn)模糊物體的動(dòng)態(tài)性和隨機(jī)性,能很好地模擬風(fēng)中飄搖的樹枝、天空中的流云、水面上的浪花、山中的薄霧、雨和雪花、園林中的噴泉等三維復(fù)雜自然景物。</p><p>  粒子系統(tǒng)的優(yōu)點(diǎn)就是用簡單的粒子圖元來構(gòu)造出傳統(tǒng)計(jì)算機(jī)圖形學(xué)難以構(gòu)造的復(fù)雜物體,而且具有很強(qiáng)的真實(shí)感和實(shí)時(shí)性,粒子系統(tǒng)在對自然景物的模擬方面得到了廣泛的應(yīng)用。</p>

34、<p>  1992年Loke[11]等人提出了應(yīng)用粒子系統(tǒng)繪制焰火的算法,采用鏈表數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)粒子,設(shè)計(jì)了粒子系統(tǒng)繪制引擎(Particle System Rendering Engine),并用粒子衍生的方法表現(xiàn)焰火粒子的軌跡實(shí)現(xiàn)了多種焰火的特殊效果。從1983年由Reeves提出粒子系統(tǒng)訓(xùn)以來,許多的研究者對粒子系統(tǒng)進(jìn)行了研究與發(fā)展。Reeves W.T用粒子系統(tǒng)模型模擬了火焰、爆炸等效果,他還成功模擬了電影《Sta

35、r Trek II:The warth of Khan》中行星被撞擊后所產(chǎn)生的爆炸及火焰等一系列特殊效果。1955年Reeves W.T和Blau[12]發(fā)展了粒子系統(tǒng)他們用“Vo1ume Filling”基本單元法生成隨時(shí)間改變形狀但又基本保持不變的實(shí)體,如隨風(fēng)飄動(dòng)的花草樹葉; Stam和Flume[13]用“元球”來描述火焰等氣態(tài)現(xiàn)象,并給出了一種扭曲“元球”的算法,使模擬的氣態(tài)景物的外形更加不規(guī)則,從而更加真實(shí);Karl Sims

36、[14]研究了粒子的動(dòng)畫及繪制算法,他利用粒子系統(tǒng)的并行特點(diǎn),提出了一個(gè)并行的粒子繪制系統(tǒng),該系統(tǒng)能繪制不同形狀、大小、顏色、透明度的粒子;won</p><p>  國內(nèi)對粒子系統(tǒng)的研究也開始深入,一些研究人員利用粒子系統(tǒng)實(shí)現(xiàn)了火焰、煙、云、導(dǎo)彈尾氣等復(fù)雜景物的效果,如謝劍斌,郝建新[19]等運(yùn)用粒子系統(tǒng)模擬了雨點(diǎn)和雪花的降落;彭群生和管宇[20]實(shí)現(xiàn)了瀑布的模擬;張芹、吳慧中[21]等模擬了火焰、煙等所具有的

37、動(dòng)態(tài)性和隨機(jī)性;王潤杰、田景全[22]等人在分析粒子系統(tǒng)的基礎(chǔ)上,提出了模擬雨雪的實(shí)時(shí)算法;王靜秋[23]等通過對焰火細(xì)節(jié)和特點(diǎn)的分析,給出了模擬焰火的數(shù)據(jù)結(jié)構(gòu),用粒子系統(tǒng)實(shí)現(xiàn)了焰火的動(dòng)態(tài)模擬,其中主要介紹了焰火的顏色、亮度、透明度、形狀、大小、尾跡和生命周期等特性及旋轉(zhuǎn)、星狀等特殊顯示效果的模擬。</p><p>  在基于粒子系統(tǒng)模擬噴泉上,國內(nèi)朱加勇,周波等[24]設(shè)計(jì)了一個(gè)基于VC++6.O和OpenGL

38、的噴泉模擬系統(tǒng),結(jié)合凹凸紋理映射技術(shù)對粒子進(jìn)入水池真實(shí)水波的產(chǎn)生、擴(kuò)散、衰減以及多個(gè)水波的交迭過程的計(jì)算機(jī)模擬,采用了OpenGL顯示列表(DisplayLists)方法繪圖,優(yōu)化了程序性能,效果逼真實(shí)現(xiàn)了真正的三維實(shí)時(shí)繪制。馬駿和朱衡君[25]基于動(dòng)態(tài)紋理和粒子系統(tǒng)實(shí)現(xiàn)了對噴泉的模擬,其方法是渲染一定量的圖像作為貼圖紋理,采用公告板技術(shù)和動(dòng)態(tài)紋理技術(shù)來實(shí)現(xiàn)紋理噴泉的繪制,但缺乏一定的靈活性;趙靜謐,張慧[3]等提出了用基于粒子系統(tǒng)與P

39、article System API的景物模擬方法,并采用Line方式渲染粒子,結(jié)合紋理映射方法對噴泉進(jìn)行了模擬;張從輝,萬華根[26]從物理建模技術(shù)出發(fā)構(gòu)建了音樂噴泉模型。</p><p>  1.3 本論文的技術(shù)路線</p><p>  本文主要根據(jù)國內(nèi)外模擬噴泉的研究現(xiàn)狀進(jìn)行了分析和借鑒。對粒子系統(tǒng)進(jìn)行了研究。結(jié)合粒子系統(tǒng)和流體動(dòng)力學(xué)原理,對噴泉粒子系統(tǒng)的原有模型進(jìn)行了進(jìn)一步的分析和

40、研究通過對噴泉運(yùn)動(dòng)的分析,利用隨機(jī)粒子在系統(tǒng)中不規(guī)則運(yùn)動(dòng)來模擬噴泉粒子運(yùn)動(dòng),從而使噴泉粒子的運(yùn)動(dòng)更加靈活。并針對于噴泉模擬效果上進(jìn)行了改進(jìn)。</p><p>  本論文主要從下面幾章闡述利用粒子系統(tǒng)實(shí)現(xiàn)噴泉的模擬:</p><p>  第一章:主要綜述了課題的國內(nèi)外研究現(xiàn)狀。對本文的研究內(nèi)容、研究目標(biāo)、研究方法和預(yù)期研究結(jié)果進(jìn)行了概述,多層次反應(yīng)了本課題的科學(xué)意義和實(shí)用價(jià)值。</p&

41、gt;<p>  第二章:提出基于OpenGL+MFC的建?;A(chǔ),分析了OpenGL渲染管道,MFC編程框架,陳述了基于OpenGL+MFC的三維模擬的編程環(huán)境配置。</p><p>  第三章:主要介紹粒子系統(tǒng)的原理和關(guān)鍵技術(shù)包括了粒子的發(fā)射,初始狀態(tài),生命周期等的控制。</p><p>  第四章:通過噴泉粒子的運(yùn)動(dòng)規(guī)律,特征,軌跡的分析研究來實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)。并對設(shè)計(jì)的過

42、程,實(shí)現(xiàn)的原理,關(guān)鍵技術(shù)和實(shí)驗(yàn)結(jié)果進(jìn)行詳細(xì)陳述。</p><p>  第五章:總結(jié)本文方法并給出進(jìn)一步的研究展望。</p><p>  2 基于OpenGL+MFC的建?;A(chǔ)</p><p>  2.1 OpenGL概述</p><p>  OpenGL是個(gè)定義了一個(gè)跨編程語言、跨平臺(tái)的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenG

43、L是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫。</p><p>  1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL。1995年OpenGL的1.1版本面市。 2003年的7月28日,SGI和ARB公布了OpenGL 1.5。2004年8月,OpenGL2.0版本發(fā)布~OpenGL 2.0標(biāo)準(zhǔn)的主要制訂者并非原來的SGI,

44、而是逐漸在ARB中占據(jù)主動(dòng)地位的3Dlabs。2008年8月初Khronos工作組在Siggraph 2008大會(huì)上宣布了OpenGL 3.0圖形接口規(guī)范,GLSL1.30 shader語言和其他新增功能將再次未來開放3D接口發(fā)展指明方向。OpenGL 3.0 API開發(fā)代號為Longs Peak,和以往一樣,OpenGL 3.0仍然作為一個(gè)開放性和跨平臺(tái)的3D圖形接口標(biāo)準(zhǔn),在Shader語言盛行的今天,OGL3.0增加了新版本的sha

45、der語言:GLSL 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。2009年3月又公布了升級版新規(guī)范OpenGL 3.1,也是這套跨平臺(tái)免費(fèi)API有史以來的第九次更新。2009年8月Khronos小組發(fā)布了OpenGL 3.2</p><p>  2.2 OpenGL渲染管道</p><p>  絕大多數(shù)OpenGL的實(shí)現(xiàn)都有一個(gè)的相類似的操作順序,一系列處理階段稱為OpenGL渲染管

46、道。如圖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>  下面我們更為詳細(xì)的介紹OpenGL渲染管道

47、的一些關(guān)鍵階段。</p><p>  2.2.1 求值器 </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)、顏色以及空間坐標(biāo)。</p><

48、p>  2.2.2 基于頂點(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è)階段將更為忙碌。如果使用了紋理,這個(gè)階段還將生成并變換紋理坐標(biāo)

49、。如果啟用了光照,就需要綜合變換后的頂點(diǎn),表面法線,光源位置,材料屬性以及其他光照信息進(jìn)行光照計(jì)算,產(chǎn)生最終的顏色值。</p><p>  2.2.3 圖元裝配 </p><p>  圖元裝配的一個(gè)主要內(nèi)容就是剪裁,它的任務(wù)是消除位于半空間(half-space)之外的那部分幾何圖元,而這個(gè)半空間是由一個(gè)平面所定義的。點(diǎn)剪裁就是簡單地接受或拒絕頂點(diǎn),直線或多邊形剪裁則可能需要添加額外的頂點(diǎn)

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

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

52、據(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ù)制到幀緩沖區(qū)的其他位置或紋理內(nèi)存中。這樣,在數(shù)據(jù)寫入到

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

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

55、的點(diǎn)畫模式,直線的寬度,點(diǎn)的大小,著色模型以及用于支持抗鋸齒處理的覆蓋計(jì)算。每個(gè)片斷方塊都將具有各自的顏色和深度值。</p><p>  2.2.7 片斷操作 </p><p>  在數(shù)據(jù)實(shí)際存儲(chǔ)到幀緩沖區(qū)之前, 將要執(zhí)行一系列的操作。這些操作可能會(huì)修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。</p><p>  第一個(gè)可能遇到的操作是紋理化。在紋理內(nèi)存中

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

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

58、ows的接口,建立在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ǔ)上來建立Windows下的應(yīng)用程序。MFC框架定義了

59、應(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><p>  在MFC編程中,入口函數(shù)W

60、inMain()被封裝在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>  MFC是一個(gè)編程框架,MFC中的各種類

61、結(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可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地

62、設(shè)計(jì)用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。</p><p>  MFC編程框架具有如下特點(diǎn):</p><p><b>  2.3.1 封裝 </b></p><p>  構(gòu)成MFC框架的是MFC類庫。MFC類庫是C++類庫。這些類或者封裝了Win32應(yīng)用程序編程接口,或者封裝

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

64、關(guān)的API函數(shù)封裝在C++ 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提出了以文檔-視圖為中心的編程模式,

65、MFC類庫封裝了對它的支持。文檔是用戶操作的數(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&g

66、t;<p> ?。?)對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ǔ)。

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

68、派生。</p><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á)到自

69、己的編程目的。</p><p>  2.3.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窗口對象時(shí),每一條Windows消息對應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這

70、些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于是,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ù)的

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

72、的模板,擴(kuò)展DLL應(yīng)用程序的模板,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)行處理。又如

73、,為了實(shí)現(xiàn)對DLL編程的支持和多線程編程的支持,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的直

74、接調(diào)用。</p><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í),

75、應(yīng)用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實(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),

76、資源文件(.rc),模塊定義文件(.def),等。 </p><p>  2.4.1 構(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類

77、對應(yīng)地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο蟆⑽臋n對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對這些類或者對象解釋如下。 </p><p><b> ?。?)應(yīng)用程序類 </b></p><p>  應(yīng)用程序類派生于CWinApp?;?/p>

78、框架的應(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類派生邊框窗口類,邊框窗口的客戶子窗口(MD

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

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

81、文檔對象來訪問和更新數(shù)據(jù)。 </p><p><b> ?。?)視類 </b></p><p>  視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對文檔的操作。 </p><p><b>  (6)文檔模板類 </b></p>

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

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

84、窗口從CMdiChildWnd派生,文檔框架窗口包含視,視從CView或其派生類派生。</p><p>  2.4.3 構(gòu)成應(yīng)用程序的文件</p><p>  通過上述分析,可知AppWizard產(chǎn)生的MDI框架程序的內(nèi)容,所定義和實(shí)現(xiàn)的類。下面,從文件的角度來考察AppWizard生成了的源碼和作用什么。表1列出了AppWizard所生成的頭文件,表2列出了了AppWizard所生成的實(shí)

85、現(xiàn)文件及其對頭文件的包含關(guān)系。 </p><p>  表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)

86、只涉及自己的定義; </p><p>  當(dāng)然,如果增加其他操作,引用其他對象,則要包含相應(yīng)的類的定義文件。</p><p>  2.5 基于OpenGL+MFC的三維模擬的編程環(huán)境配置</p><p><b>  1.創(chuàng)建MFC項(xiàng)目</b></p><p>  (1)創(chuàng)建項(xiàng)目文件。選擇File|New菜單項(xiàng),新建一個(gè)基

87、于對話框的項(xiàng)目文件MyDlgOpenGL;</p><p>  (2)修改對話框模板。刪除對話框中的靜態(tài)文本,調(diào)整控件的位置;</p><p>  2. 配置基于OpenGL+MFC的開發(fā)環(huán)境</p><p>  (1)將glu.dll,glu32.dll,glut.dll,glut32.dll,opengl32.dll文件拷貝到操作系統(tǒng)WINNT/System32

88、目錄下。</p><p>  (2)將gl.h,glaux.h,glu.h,glut.h拷貝到Microsoft Visual Studio/VC98/Include/GL目錄中中。</p><p>  (3)將glaux.lib,glu32.lib,glut32.lib,opengl32.lib拷貝到Microsoft Visual Studio/VC98/Lib目錄中。</p&g

89、t;<p>  (4)添加OpenGL開發(fā)庫文件到項(xiàng)目</p><p>  在編譯程序的時(shí)候選擇Project|Setting菜單,在Link標(biāo)簽中的Object/library modules編輯框中輸入“opengl32.lib, glut32.lib ,glu32.lib,glaux.lib”;</p><p>  (5)創(chuàng)建新類,添加消息映射。選擇View|Class

90、Wizard菜單項(xiàng),打開MFC對話框,在Add Class之中選擇New,以便添加一個(gè)新類COpenGL,且該類的基類選擇generic CWnd;最后利用MFC ClassWizard為COpenGL類添加消息WM_CREATE,WM_PAINT的映射。</p><p>  3.初始化OpenGL:(設(shè)置像素格式、創(chuàng)建OpenGL dc、rc,設(shè)置OpenGL視口變換)</p><p>

91、 ?、僭O(shè)置像素格式:為CMyTestView 類添加成員函數(shù) BOOL bSetupPixelFormat(void),用于與OpenGL 相關(guān)的設(shè)置</p><p>  /*定 義 像 素 存 儲(chǔ) 格 式 */ </p><p>  PIXELFORMATDESCRIPTOR pfd = { </p><p>  sizeof(PIXELFORMATDE

92、SCRIPTOR), // pfd結(jié)構(gòu)的大小 </p><p>  1, // 版本號 </p><p>  PFD_DRAW_TO_WINDOW | // 支持在窗口中繪圖 </p><p>  PFD_SUPPORT_OPENGL | /

93、/ 支持 OpenGL </p><p>  PFD_TYPE_RGBA, // RGBA 顏色模式 </p><p>  24, // 24 位顏色深度 </p><p>  0, 0, 0, 0, 0, 0, // 忽略顏色位

94、</p><p>  0, // 沒有非透明度緩存 </p><p>  0, // 忽略移位位 </p><p>  0, // 無累加緩存 </p><

95、p>  0, 0, 0, 0, // 忽略累加位 </p><p>  32, // 32 位深度緩存 </p><p>  0, // 無模板緩存 </p><p>  0,

96、 // 無輔助緩存 </p><p>  PFD_MAIN_PLANE, // 主層 </p><p>  0, // 保留 </p><p>  0, 0, 0

97、 // 忽略層 , 可見性和損毀掩模 </p><p><b>  }; </b></p><p>  int pixelformat; </p><p>  if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 ) </p&g

98、t;<p><b>  { </b></p><p>  MessageBox("ChoosePixelFormat failed"); </p><p>  return FALSE; </p><p><b>  } </b></p><p>  if (Set

99、PixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) </p><p><b>  { </b></p><p>  MessageBox("SetPixelFormat failed"); </p><p>  return FALSE;

100、</p><p><b>  } </b></p><p>  return TRUE;</p><p> ?、诔跏蓟瘎?chuàng)建OpenGL RC:hrc = wglCreateContext(m_pDC->GetSafeHdc()); </p><p>  wglMakeCurrent(m_pDC->GetSaf

101、eHdc(), 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&g

102、t; ?、鄢跏蓟墨@取dc:m_pDC = new CClientDC(this); </p><p>  ASSERT(m_pDC != NULL); </p><p>  ④設(shè)置OpenGL視錐體即投影變換矩陣</p><p>  glMatrixMode(GL_PROJECTION); //在修改前重設(shè)坐標(biāo)系 </p><p>  gl

103、LoadIdentity(); </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>  gluPerspective

104、(45,ratio,1,1000);</p><p> ?、拊O(shè)置OpenGL模型變換</p><p>  glMatrixMode(GL_MODELVIEW); </p><p>  glLoadIdentity();</p><p>  4 為實(shí)現(xiàn)應(yīng)用程序邏輯,在該系統(tǒng)中為CMyTestView 類添加成員函數(shù)void Init(); vo

105、id DrawFountain(); void normalize(struct point *V); void vect_mult(struct point *A, struct point *B, struct point *C); void DeleteParticles();void MoveParticles(); void AddParticles(); void LoadTexture(char *fn, int t_nu

106、m); 其中void DrawFountain();用于繪制噴泉。構(gòu)造代碼如下:</p><p>  void CMyFountainView::DrawFountain()</p><p><b>  {</b></p><p><b>  int j;</b></p><p>  struct

107、 particle *tempp;</p><p>  struct point vectd, vectl; </p><p>  float alpha, ttx, ttz;</p><p><b>  }</b></p><p>  其噴泉粒子結(jié)構(gòu)體代碼如下:</p><p>  struct

108、 particle</p><p><b>  {</b></p><p>  float t; // 粒子的生命期</p><p>  float v; // 粒子運(yùn)動(dòng)的速度</p><p>  float d; // 粒子運(yùn)動(dòng)的方向</p><p>  fl

109、oat x, y, z; // 粒子的位置坐標(biāo)</p><p>  float xd, zd; // 粒子的 X 和 Z 方向增加值</p><p>  char type; // 粒子類型(運(yùn)動(dòng)或淡化)</p><p>  float a; // 淡化 alpha 值</p><p>  struct particle

110、 *next, *prev;</p><p><b>  }</b></p><p>  5.清理工作:(析構(gòu)函數(shù)中釋放dc,rc指針)</p><p>  void CMyTestView ::OnDestroy() //清理工作</p><p><b>  { </b></p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論