2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  畢業(yè)論文</b></p><p>  論文題目: 基于粒子系統(tǒng)的噴泉模擬 </p><p>  系 別: 計(jì)算機(jī)系 </p><p>  專業(yè)年級(jí): </p><p>  學(xué) 號(hào): </

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 國(guó)內(nèi)外研究現(xiàn)狀4</p><p>  1.3 本論文的技術(shù)路線5</p><p>  2 基于OpenGL+MFC的建?;A(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)用程序的對(duì)象之間的關(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)畫(huà)中等有著廣泛的運(yùn)用。自然景物的模擬也一直是計(jì)算機(jī)圖形學(xué)中的熱門(mén)研究課題。然而,大多數(shù)自然景物的外形是隨機(jī)變化的,如:火焰、浪花、河流、瀑布、雨雪、煙霧等,很難用常規(guī)的建模方法及模擬技術(shù)來(lái)描述,因此自然景物的模擬也是具有挑戰(zhàn)性的課題。</p><p>  本文在認(rèn)真分析和總結(jié)目前國(guó)內(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)來(lái)簡(jiǎn)化粒子運(yùn)動(dòng)狀態(tài),并采用紋理融合技術(shù)實(shí)現(xiàn)對(duì)粒子的繪制。實(shí)驗(yàn)證明該方法實(shí)現(xiàn)簡(jiǎ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,簡(jiǎn)稱CG)是一種使用數(shù)學(xué)算法將二維或三維圖形轉(zhuǎn)化為計(jì)算機(jī)顯示器柵格形式的科學(xué)。簡(jiǎn)單地說(shuō),計(jì)算機(jī)圖形學(xué)就是研究如何在計(jì)算機(jī)中表示圖形、利用計(jì)算

21、機(jī)進(jìn)行圖形計(jì)算、處理和顯示的相關(guān)原理與算法。1982年,國(guó)際標(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)建物體模型的一門(mén)學(xué)科[1]。</p><p>  近年來(lái),諸如云彩、瀑布、雨、雪等不規(guī)則模糊物體的模擬越來(lái)越成為計(jì)算機(jī)圖形學(xué)中最具挑戰(zhàn)性的研究方向之一,它們的模擬在計(jì)算機(jī)游戲、影視、廣告、視景仿真等各種領(lǐng)域得到了越來(lái)越廣泛的應(yīng)

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

23、映射和融合該技術(shù)繪制粒子。結(jié)果表明等加速運(yùn)動(dòng)方法使粒子運(yùn)動(dòng)路徑更加簡(jiǎn)單,可以獲得好的實(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)域中研究的熱門(mén)方向之一,虛擬場(chǎng)景是虛擬現(xiàn)實(shí)系統(tǒng)中重要的組成部分,在虛擬場(chǎng)景中模擬生活中的自然景物一直是計(jì)算機(jī)圖形學(xué)領(lǐng)域中

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

25、動(dòng)畫(huà)研究中的熱門(mén)課題。其中的煙火爆炸、云霧閃電、瀑布浪花、飛沙塵埃、花草樹(shù)木等景物的模擬更具有挑戰(zhàn)性。這些自然景物因其形狀、形態(tài)隨時(shí)間的推移而動(dòng)態(tài)地、隨機(jī)地發(fā)生變化,很難用常規(guī)的建模方法及模擬技術(shù)來(lái)生成。隨機(jī)模型是處理這類問(wèn)題的一種先進(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é)校、廣場(chǎng)、生活小區(qū)、公園等工作及休閑娛樂(lè)場(chǎng)所皆可看到各種不同的噴泉[3]。因此,在虛擬風(fēng)景園林、虛擬校園、虛擬城市、虛擬公園等大的虛擬場(chǎng)景中,噴泉是一個(gè)風(fēng)景點(diǎn)。粒子系統(tǒng)是最合適在虛擬場(chǎng)景中建立噴泉模型的選擇。</p><p>  論文研究的意義在于粒子系統(tǒng)方法在模擬不規(guī)則動(dòng)態(tài)自然景物的研究領(lǐng)域開(kāi)

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)基本算法來(lái)構(gòu)造復(fù)雜物體并逼真的對(duì)其進(jìn)行實(shí)時(shí)渲染是虛擬現(xiàn)實(shí)技術(shù)研究的新課題。</p><p>  虛擬噴泉技術(shù)在房地產(chǎn)開(kāi)發(fā)、建筑設(shè)計(jì)、影視制作、游戲設(shè)計(jì),風(fēng)景園林等方面具有非常廣闊的應(yīng)用前景。在虛擬場(chǎng)景中水的效果對(duì)增強(qiáng)場(chǎng)景真實(shí)感有十分重

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

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

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

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

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

33、統(tǒng)的造型方法具有局限性,而粒子系統(tǒng)的出現(xiàn)卻較好的解決了這一難題。粒子系統(tǒng)能充分體現(xiàn)模糊物體的動(dòng)態(tài)性和隨機(jī)性,能很好地模擬風(fēng)中飄搖的樹(shù)枝、天空中的流云、水面上的浪花、山中的薄霧、雨和雪花、園林中的噴泉等三維復(fù)雜自然景物。</p><p>  粒子系統(tǒng)的優(yōu)點(diǎn)就是用簡(jiǎn)單的粒子圖元來(lái)構(gòu)造出傳統(tǒng)計(jì)算機(jī)圖形學(xué)難以構(gòu)造的復(fù)雜物體,而且具有很強(qiáng)的真實(shí)感和實(shí)時(shí)性,粒子系統(tǒng)在對(duì)自然景物的模擬方面得到了廣泛的應(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)以來(lái),許多的研究者對(duì)粒子系統(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)的花草樹(shù)葉; Stam和Flume[13]用“元球”來(lái)描述火焰等氣態(tài)現(xiàn)象,并給出了一種扭曲“元球”的算法,使模擬的氣態(tài)景物的外形更加不規(guī)則,從而更加真實(shí);Karl Sims

36、[14]研究了粒子的動(dòng)畫(huà)及繪制算法,他利用粒子系統(tǒng)的并行特點(diǎn),提出了一個(gè)并行的粒子繪制系統(tǒng),該系統(tǒng)能繪制不同形狀、大小、顏色、透明度的粒子;won</p><p>  國(guó)內(nèi)對(duì)粒子系統(tǒng)的研究也開(kāi)始深入,一些研究人員利用粒子系統(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ī)性;王潤(rùn)杰、田景全[22]等人在分析粒子系統(tǒng)的基礎(chǔ)上,提出了模擬雨雪的實(shí)時(shí)算法;王靜秋[23]等通過(guò)對(duì)焰火細(xì)節(jié)和特點(diǎn)的分析,給出了模擬焰火的數(shù)據(jù)結(jié)構(gòu),用粒子系統(tǒng)實(shí)現(xiàn)了焰火的動(dòng)態(tài)模擬,其中主要介紹了焰火的顏色、亮度、透明度、形狀、大小、尾跡和生命周期等特性及旋轉(zhuǎn)、星狀等特殊顯示效果的模擬。</p><p>  在基于粒子系統(tǒng)模擬噴泉上,國(guó)內(nèi)朱加勇,周波等[24]設(shè)計(jì)了一個(gè)基于VC++6.O和OpenGL

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

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

40、研究通過(guò)對(duì)噴泉運(yùn)動(dòng)的分析,利用隨機(jī)粒子在系統(tǒng)中不規(guī)則運(yùn)動(dòng)來(lái)模擬噴泉粒子運(yùn)動(dòng),從而使噴泉粒子的運(yùn)動(dòng)更加靈活。并針對(duì)于噴泉模擬效果上進(jìn)行了改進(jìn)。</p><p>  本論文主要從下面幾章闡述利用粒子系統(tǒng)實(shí)現(xiàn)噴泉的模擬:</p><p>  第一章:主要綜述了課題的國(guó)內(nèi)外研究現(xiàn)狀。對(duì)本文的研究?jī)?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>  第四章:通過(guò)噴泉粒子的運(yùn)動(dòng)規(guī)律,特征,軌跡的分析研究來(lái)實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)。并對(duì)設(shè)計(jì)的過(guò)

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è)跨編程語(yǔ)言、跨平臺(tái)的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenG

43、L是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫(kù)。</p><p>  1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開(kāi)發(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)的主要制訂者并非原來(lái)的SGI,

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

45、der語(yǔ)言:GLSL 1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。2009年3月又公布了升級(jí)版新規(guī)范OpenGL 3.1,也是這套跨平臺(tái)免費(fèi)API有史以來(lái)的第九次更新。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ù)的過(guò)程。幾何數(shù)據(jù)(頂點(diǎn)、線、多邊形)跟隨著這些路徑通過(guò)這些代表求值程序和每一個(gè)頂點(diǎn)操作的盒子,而像素?cái)?shù)據(jù)(像素、圖像、位圖)的部分加工處理過(guò)程有些不同。在將最后的像素?cái)?shù)據(jù)寫(xiě)到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過(guò)最后相同的步驟(光柵化和片段操作)。</p><p>  圖1 OpenGL渲染管道</p><p>  下面我們更為詳細(xì)的介紹OpenGL渲染管道

47、的一些關(guān)鍵階段。</p><p>  2.2.1 求值器 </p><p>  所有的幾何圖元最終都要通過(guò)頂點(diǎn)來(lái)描述。參數(shù)化曲線和表面最初可能是通過(guò)控制點(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>  對(duì)于頂點(diǎn)數(shù)據(jù),接下來(lái)的一個(gè)步驟就是"基于頂點(diǎn)的操作",就是把頂點(diǎn)變換為圖元。有些類型的頂點(diǎn)數(shù)據(jù)(例如空間坐標(biāo))是通過(guò)一個(gè)4*4的浮點(diǎn)矩陣進(jìn)行變換的。空間坐標(biāo)從3D世界的一個(gè)位置投影到屏幕上的一個(gè)位置。</p><p>  如果啟用了高級(jí)特性,這個(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)剪裁就是簡(jiǎn)單地接受或拒絕頂點(diǎn),直線或多邊形剪裁則可能需要添加額外的頂點(diǎn)

50、,具體取決于直線或多邊形是如何進(jìn)行剪裁的。在有些情況下,接下來(lái)需要執(zhí)行一個(gè)稱為透視除法(perspective division)的步驟。它使遠(yuǎn)處的物體看起來(lái)比近處的物體更小一些。接下來(lái)所進(jìn)行的是視口(viewport)和深度(z坐標(biāo))操作。如果啟用了剔除功能(culling)并且該圖元是個(gè)多邊形,那么它就有可能被剔除測(cè)試所拒絕。取決于多邊形模式,多邊形可能被畫(huà)成點(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)歷的流程有所不同。首先,來(lái)自系統(tǒng)內(nèi)存的一個(gè)數(shù)組中的像素進(jìn)行解包,從某種格式(像素的原始格式可能有多種)解包為適當(dāng)數(shù)量的數(shù)

52、據(jù)成分。接著,這些數(shù)據(jù)被縮放、偏移,并根據(jù)一副像素圖進(jìn)行處理。處理結(jié)果先進(jìn)行截取,然后或者寫(xiě)入到紋理內(nèi)存,或者發(fā)送到光棚化階段。如果像素?cái)?shù)據(jù)時(shí)從幀緩沖區(qū)讀取的,就對(duì)他們執(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ù)寫(xiě)入到

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

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

55、的點(diǎn)畫(huà)模式,直線的寬度,點(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ì)算,然后是剪裁測(cè)試,alpha測(cè)試,模板測(cè)試和深度緩沖區(qū)測(cè)試(深度緩沖區(qū)用于消除被隱藏的表面)。如果一個(gè)片斷無(wú)法通過(guò)一個(gè)啟用的測(cè)試,它的連續(xù)處理過(guò)程可能會(huì)被中斷。隨后,將要執(zhí)行的可能是混合,抖動(dòng),邏輯操作以及根據(jù)一個(gè)位掩碼的屏蔽操作。最后,經(jīng)過(guò)完整處理的片斷就被繪制到適當(dāng)?shù)木彌_區(qū),最終成為一個(gè)像素并到達(dá)它的最終歸宿。</p>

57、<p><b>  2.3 MFC概述</b></p><p>  MFC,微軟基礎(chǔ)類(Microsoft Foundation Classes), 用于在C++環(huán)境下編寫(xiě)應(yīng)用程序的一個(gè)框架和引擎。該類庫(kù)提供一組通用的可重用的類庫(kù)供開(kāi)發(fā)人員使用。大部分類均從CObject 直接或間接派生,只有少部分類例外。</p><p>  MFC類庫(kù)作為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)的功能提供了簡(jiǎn)便方法。</p><p>  MFC中的各種類結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,讓程序員在此基礎(chǔ)上來(lái)建立Windows下的應(yīng)用程序。MFC框架定義了

59、應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Visual C++提供了相應(yīng)的工具來(lái)完成這個(gè)工作:AppWizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于直觀地設(shè)計(jì)用戶界面;ClassWizard用來(lái)協(xié)助添加代碼到框架文件;最后進(jìn)行編譯,則通過(guò)類庫(kù)實(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為程序員提供了一種快捷方便的工具來(lái)定制基于MFC的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來(lái)實(shí)現(xiàn)所需功能。</p><p>  MFC是一個(gè)編程框架,MFC中的各種類

61、結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來(lái)建立Windows下的應(yīng)用程序,這是一種相對(duì)SDK來(lái)說(shuō)更為簡(jiǎn)單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Microsoft Visual C++提供了相應(yīng)的工具來(lái)完成這個(gè)工作:AppWizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地

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

63、了應(yīng)用程序的概念,或者封裝了OLE特性,或者封裝了ODBC和DAO數(shù)據(jù)訪問(wèn)的功能,等等,分述如下。</p><p> ?。?)對(duì)Win32應(yīng)用程序編程接口的封裝</p><p>  用一個(gè)C++ Object來(lái)包裝一個(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> ?。?)對(duì)應(yīng)用程序概念的封裝</p><p>  使用SDK編寫(xiě)Windows應(yīng)用程序時(shí),總要定義窗口過(guò)程,登記Windows Class,創(chuàng)建窗口,等等。MFC把許多類似的處理封裝起來(lái),替程序員完成這些工作。另外,MFC提出了以文檔-視圖為中心的編程模式,

65、MFC類庫(kù)封裝了對(duì)它的支持。文檔是用戶操作的數(shù)據(jù)對(duì)象,視圖是數(shù)據(jù)操作的窗口,用戶通過(guò)它處理、查看數(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&g

66、t;<p> ?。?)對(duì)ODBC功能的封裝</p><p>  以少量的能提供與ODBC之間更高級(jí)接口的C++類,封裝了ODBC API的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫(kù)編程模式。</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)建、對(duì)象序列化、對(duì)程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過(guò)封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget

68、派生。</p><p>  針對(duì)每種不同的對(duì)象,MFC都設(shè)計(jì)了一組類對(duì)這些對(duì)象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對(duì)象包括以下種類:窗口對(duì)象,基類是CWnd,派生了CView類;應(yīng)用程序?qū)ο?,基類是CwinThread;文檔對(duì)象,基類是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è)問(wèn)題必須解決:如果僅僅通過(guò)虛擬函數(shù)來(lái)支持動(dòng)態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過(guò)于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝 Windows窗口對(duì)象時(shí),每一條Windows消息對(duì)應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這

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

71、內(nèi)幕,讓讀者對(duì)MFC的編程接口有清晰的理解。</p><p>  2.3.4 MFC的宏觀框架體系 </p><p>  如前所述,MFC實(shí)現(xiàn)了對(duì)應(yīng)用程序概念的封裝,把類、類的繼承、動(dòng)態(tài)約束、類的關(guān)系和相互作用等封裝起來(lái)。這樣封裝的結(jié)果對(duì)程序員來(lái)說(shuō),是一套開(kāi)發(fā)模板(或者說(shuō)模式)。針對(duì)不同的應(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>  為了支持對(duì)應(yīng)用程序概念的封裝,MFC內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如

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

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

75、應(yīng)用程序特定的事件由程序員的派生類來(lái)處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是C++對(duì)繼承的支持,對(duì)虛擬函數(shù)的支持,以及MFC實(shí)現(xiàn)的消息映射機(jī)制。</p><p>  2.4 MFC編程框架</p><p>  用AppWizard產(chǎn)生一個(gè)MDI工程t(無(wú)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、對(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)用程序類派生于CWinApp。基于

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>  邊框窗口用來(lái)管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預(yù)覽)。 <

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

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

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

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

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

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

86、只涉及自己的定義; </p><p>  當(dāng)然,如果增加其他操作,引用其他對(duì)象,則要包含相應(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、于對(duì)話框的項(xiàng)目文件MyDlgOpenGL;</p><p>  (2)修改對(duì)話框模板。刪除對(duì)話框中的靜態(tài)文本,調(diào)整控件的位置;</p><p>  2. 配置基于OpenGL+MFC的開(kāi)發(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開(kāi)發(fā)庫(kù)文件到項(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),打開(kāi)MFC對(duì)話框,在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, // 版本號(hào) </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, // 沒(méi)有非透明度緩存 </p><p>  0, // 忽略移位位 </p><p>  0, // 無(wú)累加緩存 </p><

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

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

97、 // 忽略層 , 可見(jiàn)性和損毀掩模 </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> ?、茉O(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論