基于粒子系統(tǒng)的噴泉模擬-本科畢業(yè)論文_第1頁(yè)
基于粒子系統(tǒng)的噴泉模擬-本科畢業(yè)論文_第2頁(yè)
基于粒子系統(tǒng)的噴泉模擬-本科畢業(yè)論文_第3頁(yè)
基于粒子系統(tǒng)的噴泉模擬-本科畢業(yè)論文_第4頁(yè)
基于粒子系統(tǒng)的噴泉模擬-本科畢業(yè)論文_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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)介

PAGEPAGEIII畢業(yè)論文論文題目:基于粒子系統(tǒng)的噴泉模擬系別:計(jì)算機(jī)系專業(yè)年級(jí):學(xué)號(hào):姓名:指導(dǎo)教師、職稱:年月日FountainsimulationbasedonparticlesystemCollege:SpecialtyandGrade:Number:Name:Advisor:Submittedtime:

目錄摘要 1Abstract 21緒論 31.1研究背景、意義 31.2國(guó)內(nèi)外研究現(xiàn)狀 41.3本論文的技術(shù)路線 52基于OpenGL+MFC的建?;A(chǔ) 62.1OpenGL概述 62.2OpenGL渲染管道 62.2.1求值器 62.2.2基于頂點(diǎn)的操作 72.2.3圖元裝配 72.2.4像素操作 72.2.5紋理裝配 72.2.6光棚化 72.2.7片斷操作 72.3MFC概述 82.3.1封裝 82.3.2繼承 92.3.3虛擬函數(shù)和動(dòng)態(tài)約束 92.3.4MFC的宏觀框架體系 92.4MFC編程框架 102.4.1構(gòu)成應(yīng)用程序?qū)ο?102.4.2構(gòu)成應(yīng)用程序的對(duì)象之間的關(guān)系 112.4.3構(gòu)成應(yīng)用程序的文件 112.5基于OpenGL+MFC的三維模擬的編程環(huán)境配置 133粒子系統(tǒng)的原理和關(guān)鍵技術(shù) 163.1計(jì)算機(jī)圖形學(xué)原理 163.2粒子系統(tǒng)的理論 163.3粒子系統(tǒng)的基本模型 163.3.1粒子的生成 173.3.2粒子屬性初始化 173.3.3粒子的運(yùn)動(dòng)狀態(tài) 183.3.4粒子的消亡 193.3.5粒子的繪制 194系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 204.1系統(tǒng)的關(guān)鍵技術(shù)分析 204.1.1噴泉現(xiàn)象的運(yùn)動(dòng)規(guī)律 204.1.2噴泉現(xiàn)象特征 214.2系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 214.2.1噴泉粒子系統(tǒng)的邏輯視圖 214.2.2噴泉粒子系統(tǒng)實(shí)現(xiàn)的關(guān)鍵代碼 234.3模擬結(jié)果 285結(jié)論與展望 295.1全文總結(jié) 295.2進(jìn)一步展望 29參考文獻(xiàn) 30致謝 33PAGE33摘要自然景物的模擬在視景仿真系統(tǒng)、計(jì)算機(jī)游戲、三維動(dòng)畫中等有著廣泛的運(yùn)用。自然景物的模擬也一直是計(jì)算機(jī)圖形學(xué)中的熱門研究課題。然而,大多數(shù)自然景物的外形是隨機(jī)變化的,如:火焰、浪花、河流、瀑布、雨雪、煙霧等,很難用常規(guī)的建模方法及模擬技術(shù)來(lái)描述,因此自然景物的模擬也是具有挑戰(zhàn)性的課題。本文在認(rèn)真分析和總結(jié)目前國(guó)內(nèi)外噴泉模擬的基礎(chǔ)上,以實(shí)時(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í)性和逼真性的要求。關(guān)鍵詞:粒子系統(tǒng);噴泉模擬;虛擬現(xiàn)實(shí);0penGL

AbstractThenaturalsceneryinvisualsimulationsystemissimulated,thecomputergames,3danimationmediumhaveextensiveuseof.Thenaturalsceneryofsimulationhasbeencomputergraphics.ahotresearchtopic.However,mostofthenaturalsceneryhaverandomchangeshape,suchasflame,spray,rivers,waterfalls,snow,smoke,etc.Itisdifficulttouseconventionalmodelingmethodandsimulationtechnologytodescribethenaturalscenery,sothesimulationofnaturalsceneryisachallengingtask.Basedontheanalysisandsummaryfountainathomeandabroadonthebasisofsimulation,real-timeandlifelike,particlesystemwasproposed.CombinedwithOpenGLandphysicalprinciple,usingMFCprogrammingsimulationofparticletrajectoriesfountain,combinedaccelerationmotiontosimplifyparticlemovement,andtherealizationofparticletexturefusiontechnology.Experimentresultsshowthatthemethodissimple,thefountainofsimulationresultsmeetrequirementofreal-timeandlifelike.Keywords:particlesystems,Fountainsimulation,Virtualreality,0penGL

1緒論計(jì)算機(jī)圖形學(xué)(ComputerGraphics,簡(jiǎn)稱CG)是一種使用數(shù)學(xué)算法將二維或三維圖形轉(zhuǎn)化為計(jì)算機(jī)顯示器柵格形式的科學(xué)。簡(jiǎn)單地說(shuō),計(jì)算機(jī)圖形學(xué)就是研究如何在計(jì)算機(jī)中表示圖形、利用計(jì)算機(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)建物體模型的一門學(xué)科[1]。近年來(lái),諸如云彩、瀑布、雨、雪等不規(guī)則模糊物體的模擬越來(lái)越成為計(jì)算機(jī)圖形學(xué)中最具挑戰(zhàn)性的研究方向之一,它們的模擬在計(jì)算機(jī)游戲、影視、廣告、視景仿真等各種領(lǐng)域得到了越來(lái)越廣泛的應(yīng)用。具有不規(guī)則的幾何外形和內(nèi)在不確定性的不規(guī)則模糊物體,不能用通常的三維建模方法來(lái)制作,不同于靜態(tài)景物,它具有產(chǎn)生、發(fā)展和消滅的過(guò)程。粒子系統(tǒng)(particlesystem)是迄今為止模擬不規(guī)則模糊物體最為成功的一種圖形生成算法。噴泉模擬過(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的紋理映射和融合該技術(shù)繪制粒子。結(jié)果表明等加速運(yùn)動(dòng)方法使粒子運(yùn)動(dòng)路徑更加簡(jiǎn)單,可以獲得好的實(shí)時(shí)性,利用融合渲染粒子的方法也使噴泉模擬效果滿足了虛擬現(xiàn)實(shí)、計(jì)算機(jī)仿真中真實(shí)感的要求。1.1研究背景、意義虛擬現(xiàn)實(shí)技術(shù)在當(dāng)今計(jì)算機(jī)信息科學(xué)領(lǐng)域中研究的熱門方向之一,虛擬場(chǎng)景是虛擬現(xiàn)實(shí)系統(tǒng)中重要的組成部分,在虛擬場(chǎng)景中模擬生活中的自然景物一直是計(jì)算機(jī)圖形學(xué)領(lǐng)域中研究的內(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)畫目前廣泛應(yīng)用于航空航天、影視廣告、行為模擬、裝演設(shè)計(jì)、虛擬場(chǎng)景等各種領(lǐng)域??梢灶A(yù)見(jiàn),在未來(lái)的信息工業(yè)和產(chǎn)業(yè)中,計(jì)算機(jī)動(dòng)畫將更進(jìn)一步發(fā)揮巨大的作用,占據(jù)重要的地位。近年來(lái),對(duì)于自然景物的生成與模擬一直是計(jì)算機(jī)圖形學(xué)和動(dòng)畫研究中的熱門課題。其中的煙火爆炸、云霧閃電、瀑布浪花、飛沙塵埃、花草樹(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é)意義和廣泛的應(yīng)用前景。噴泉是這些景物中具有代表性的動(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)景中建立噴泉模型的選擇。論文研究的意義在于粒子系統(tǒng)方法在模擬不規(guī)則動(dòng)態(tài)自然景物的研究領(lǐng)域開(kāi)辟了很大的發(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ù)研究的新課題。虛擬噴泉技術(shù)在房地產(chǎn)開(kāi)發(fā)、建筑設(shè)計(jì)、影視制作、游戲設(shè)計(jì),風(fēng)景園林等方面具有非常廣闊的應(yīng)用前景。在虛擬場(chǎng)景中水的效果對(duì)增強(qiáng)場(chǎng)景真實(shí)感有十分重要的作用,其中噴泉效果是虛擬場(chǎng)景中常見(jiàn)的畫面,例如風(fēng)景園林的動(dòng)態(tài)噴泉水景,將計(jì)算機(jī)產(chǎn)生的許多奇妙噴泉水景圖像添加到虛擬漫游系統(tǒng)或影視作品中可以大大提高作品的觀賞效果。虛擬噴泉的沉浸性、真實(shí)性以及實(shí)時(shí)性效果是傳統(tǒng)平面效果圖和動(dòng)畫播放所無(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ù)在一定程度上會(huì)得到廣泛的應(yīng)用,利用粒子系統(tǒng)實(shí)現(xiàn)噴泉的三維效果在虛擬現(xiàn)實(shí)領(lǐng)域具有一定的研究意義。1.2國(guó)內(nèi)外研究現(xiàn)狀在對(duì)于仿真噴泉、瀑布、火焰、樹(shù)木、雨、雪、霧等這些生活中常見(jiàn)的自然景物過(guò)程中,由于這些景物具有不規(guī)則性,動(dòng)態(tài)性和隨機(jī)性,模擬起來(lái)十分的困難,同時(shí)也是虛擬場(chǎng)景中不可缺少的部分。而自然景物的模擬一直是虛擬現(xiàn)實(shí)領(lǐng)域的重要研究?jī)?nèi)容,如何在虛擬場(chǎng)景中真實(shí)的再現(xiàn)生活中的自然景物是極具挑戰(zhàn)性的課題之一。自然景物的模擬一般有兩種方法[4]:一種是基于物理建模技術(shù)的方法。基于物理建模技術(shù)的方法主要是通過(guò)對(duì)Navier-Stokes(納維埃一斯托克斯,簡(jiǎn)稱N—S方程)方程求解,求出流體過(guò)斷面時(shí)的平均流速[5]。在基于物理的真實(shí)水流模擬方面,Anderson[6]等人從工程需要出發(fā),基于Navier-Stokes方程準(zhǔn)確描述了水流的形態(tài);而Kass[7]等人則以動(dòng)畫中快速模擬為目標(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-Stokes方程,但由于Navicr-Stokes方程組是非線性方程組,很多情況下都難以精確地求出解析解,即使能求出其特解也往往因?yàn)榍蠼庥?jì)算量太大而難以達(dá)到實(shí)時(shí)的要求。另一種是基于粒子系統(tǒng)的方法。自然景物與規(guī)則的幾何物體不同,它們的表面往往包含有豐富的細(xì)節(jié)或具有隨機(jī)變化的形狀,這些細(xì)節(jié)與隨機(jī)變化的形狀很難用傳統(tǒng)的解析曲面來(lái)描述。比如說(shuō)對(duì)噴泉、水流、云、霧、煙、雪、火花等自然景物的模擬上,傳統(tǒng)的造型方法具有局限性,而粒子系統(tǒng)的出現(xiàn)卻較好的解決了這一難題。粒子系統(tǒng)能充分體現(xiàn)模糊物體的動(dòng)態(tài)性和隨機(jī)性,能很好地模擬風(fēng)中飄搖的樹(shù)枝、天空中的流云、水面上的浪花、山中的薄霧、雨和雪花、園林中的噴泉等三維復(fù)雜自然景物。粒子系統(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)用。1992年Loke[11]等人提出了應(yīng)用粒子系統(tǒng)繪制焰火的算法,采用鏈表數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)粒子,設(shè)計(jì)了粒子系統(tǒng)繪制引擎(ParticleSystemRenderingEngine),并用粒子衍生的方法表現(xiàn)焰火粒子的軌跡實(shí)現(xiàn)了多種焰火的特殊效果。從1983年由Reeves提出粒子系統(tǒng)訓(xùn)以來(lái),許多的研究者對(duì)粒子系統(tǒng)進(jìn)行了研究與發(fā)展。ReevesW.T用粒子系統(tǒng)模型模擬了火焰、爆炸等效果,他還成功模擬了電影《StarTrekII:ThewarthofKhan》中行星被撞擊后所產(chǎn)生的爆炸及火焰等一系列特殊效果。1955年ReevesW.T和Blau[12]發(fā)展了粒子系統(tǒng)他們用“Vo1umeFilling”基本單元法生成隨時(shí)間改變形狀但又基本保持不變的實(shí)體,如隨風(fēng)飄動(dòng)的花草樹(shù)葉;Stam和Flume[13]用“元球”來(lái)描述火焰等氣態(tài)現(xiàn)象,并給出了一種扭曲“元球”的算法,使模擬的氣態(tài)景物的外形更加不規(guī)則,從而更加真實(shí);KarlSims[14]研究了粒子的動(dòng)畫及繪制算法,他利用粒子系統(tǒng)的并行特點(diǎn),提出了一個(gè)并行的粒子繪制系統(tǒng),該系統(tǒng)能繪制不同形狀、大小、顏色、透明度的粒子;wong[15]使用粒子系統(tǒng)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的瀑布模型,在該模型中設(shè)置了瀑布下落過(guò)程中的障礙(如巖石等);FournierA[16]等在研究海浪模型中利用粒子系統(tǒng)模擬了浪花,并提出了浪花所產(chǎn)生的條件;Teng-seeLoke[11]等人基于粒子系統(tǒng),使用牛頓運(yùn)動(dòng)定律來(lái)描述煙火,對(duì)煙火的運(yùn)動(dòng)、顏色、形狀、亮度、尾跡等進(jìn)行仿真,取得了很好的效果。M.E.Goss[17]使用粒子系統(tǒng)模擬了船行駛時(shí)產(chǎn)生的尾跡,主要是從外形上模擬船的尾跡。MatthiasUnbescheiden和AndrzejTrembilski[18]運(yùn)用粒子系統(tǒng),從云的物理原理出發(fā),結(jié)合紋理映射技術(shù)建立了云的模型,其核心是采用具有紋理的多面體頂點(diǎn)集代替粒子群,該模型大大減少了粒子系統(tǒng)中粒子的數(shù)量,從而使粒子系統(tǒng)的實(shí)時(shí)仿真得以實(shí)現(xiàn)。國(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]等模擬了火焰、煙等所具有的動(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)、星狀等特殊顯示效果的模擬。在基于粒子系統(tǒng)模擬噴泉上,國(guó)內(nèi)朱加勇,周波等[24]設(shè)計(jì)了一個(gè)基于VC++6.O和OpenGL的噴泉模擬系統(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)與ParticleSystemAPI的景物模擬方法,并采用Line方式渲染粒子,結(jié)合紋理映射方法對(duì)噴泉進(jìn)行了模擬;張從輝,萬(wàn)華根[26]從物理建模技術(shù)出發(fā)構(gòu)建了音樂(lè)噴泉模型。1.3本論文的技術(shù)路線本文主要根據(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)一步的分析和研究通過(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)。本論文主要從下面幾章闡述利用粒子系統(tǒng)實(shí)現(xiàn)噴泉的模擬:第一章:主要綜述了課題的國(guó)內(nèi)外研究現(xiàn)狀。對(duì)本文的研究?jī)?nèi)容、研究目標(biāo)、研究方法和預(yù)期研究結(jié)果進(jìn)行了概述,多層次反應(yīng)了本課題的科學(xué)意義和實(shí)用價(jià)值。第二章:提出基于OpenGL+MFC的建?;A(chǔ),分析了OpenGL渲染管道,MFC編程框架,陳述了基于OpenGL+MFC的三維模擬的編程環(huán)境配置。第三章:主要介紹粒子系統(tǒng)的原理和關(guān)鍵技術(shù)包括了粒子的發(fā)射,初始狀態(tài),生命周期等的控制。第四章:通過(guò)噴泉粒子的運(yùn)動(dòng)規(guī)律,特征,軌跡的分析研究來(lái)實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)。并對(duì)設(shè)計(jì)的過(guò)程,實(shí)現(xiàn)的原理,關(guān)鍵技術(shù)和實(shí)驗(yàn)結(jié)果進(jìn)行詳細(xì)陳述。第五章:總結(jié)本文方法并給出進(jìn)一步的研究展望。

2基于OpenGL+MFC的建模基礎(chǔ)2.1OpenGL概述OpenGL是個(gè)定義了一個(gè)跨編程語(yǔ)言、跨平臺(tái)的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenGL是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫(kù)。1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開(kāi)發(fā)了WindowsNT版本的OpenGL。1995年OpenGL的1.1版本面市。2003年的7月28日,SGI和ARB公布了OpenGL1.5。2004年8月,OpenGL2.0版本發(fā)布~OpenGL2.0標(biāo)準(zhǔn)的主要制訂者并非原來(lái)的SGI,而是逐漸在ARB中占據(jù)主動(dòng)地位的3Dlabs。2008年8月初Khronos工作組在Siggraph2008大會(huì)上宣布了OpenGL3.0圖形接口規(guī)范,GLSL1.30shader語(yǔ)言和其他新增功能將再次未來(lái)開(kāi)放3D接口發(fā)展指明方向。OpenGL3.0API開(kāi)發(fā)代號(hào)為L(zhǎng)ongsPeak,和以往一樣,OpenGL3.0仍然作為一個(gè)開(kāi)放性和跨平臺(tái)的3D圖形接口標(biāo)準(zhǔn),在Shader語(yǔ)言盛行的今天,OGL3.0增加了新版本的shader語(yǔ)言:GLSL1.30,可以充分發(fā)揮當(dāng)前可編程圖形硬件的潛能。2009年3月又公布了升級(jí)版新規(guī)范OpenGL3.1,也是這套跨平臺(tái)免費(fèi)API有史以來(lái)的第九次更新。2009年8月Khronos小組發(fā)布了OpenGL3.2,這是一年以來(lái)OpenGL進(jìn)行的第三次重要升級(jí)。Khronos旗下的OpenGLARB(ArchitectureReviewBoard)工作組推出了GLSL1.5OpenGLShadingLanguage(OpenGL著色語(yǔ)言)的升級(jí)版,以及在OpenGL3.2框架下推出了兩個(gè)新功能,可以讓開(kāi)發(fā)者在開(kāi)發(fā)新程序時(shí)能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會(huì)提供與舊版OpenGL之間的兼容性。2.2OpenGL渲染管道絕大多數(shù)OpenGL的實(shí)現(xiàn)都有一個(gè)的相類似的操作順序,一系列處理階段稱為OpenGL渲染管道。如圖1顯示了OpenGL處理數(shù)據(jù)的過(guò)程。幾何數(shù)據(jù)(頂點(diǎn)、線、多邊形)跟隨著這些路徑通過(guò)這些代表求值程序和每一個(gè)頂點(diǎn)操作的盒子,而像素?cái)?shù)據(jù)(像素、圖像、位圖)的部分加工處理過(guò)程有些不同。在將最后的像素?cái)?shù)據(jù)寫到幀緩存前,兩種類型的數(shù)據(jù)都要經(jīng)過(guò)最后相同的步驟(光柵化和片段操作)。圖1OpenGL渲染管道下面我們更為詳細(xì)的介紹OpenGL渲染管道的一些關(guān)鍵階段。2.2.1求值器所有的幾何圖元最終都要通過(guò)頂點(diǎn)來(lái)描述。參數(shù)化曲線和表面最初可能是通過(guò)控制點(diǎn)以及成為基函數(shù)(Basicfunction)的多項(xiàng)式函數(shù)進(jìn)行描述的。求職器提供了一種方法。根據(jù)控制點(diǎn)計(jì)算表示表面的頂點(diǎn)。這種方法是一種多項(xiàng)式映射,它可以根據(jù)控制點(diǎn)產(chǎn)生表面法線、紋理坐標(biāo)、顏色以及空間坐標(biāo)。2.2.2基于頂點(diǎn)的操作對(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)行變換的??臻g坐標(biāo)從3D世界的一個(gè)位置投影到屏幕上的一個(gè)位置。如果啟用了高級(jí)特性,這個(gè)階段將更為忙碌。如果使用了紋理,這個(gè)階段還將生成并變換紋理坐標(biāo)。如果啟用了光照,就需要綜合變換后的頂點(diǎn),表面法線,光源位置,材料屬性以及其他光照信息進(jìn)行光照計(jì)算,產(chǎn)生最終的顏色值。2.2.3圖元裝配圖元裝配的一個(gè)主要內(nèi)容就是剪裁,它的任務(wù)是消除位于半空間(half-space)之外的那部分幾何圖元,而這個(gè)半空間是由一個(gè)平面所定義的。點(diǎn)剪裁就是簡(jiǎn)單地接受或拒絕頂點(diǎn),直線或多邊形剪裁則可能需要添加額外的頂點(diǎn),具體取決于直線或多邊形是如何進(jìn)行剪裁的。在有些情況下,接下來(lái)需要執(zhí)行一個(gè)稱為透視除法(perspectivedivision)的步驟。它使遠(yuǎn)處的物體看起來(lái)比近處的物體更小一些。接下來(lái)所進(jìn)行的是視口(viewport)和深度(z坐標(biāo))操作。如果啟用了剔除功能(culling)并且該圖元是個(gè)多邊形,那么它就有可能被剔除測(cè)試所拒絕。取決于多邊形模式,多邊形可能被畫成點(diǎn)的形式或者直線的形式。這個(gè)階段所產(chǎn)生的結(jié)果就是完整的幾何圖元,也就是根據(jù)相關(guān)的顏色,深度(有時(shí)還有紋理坐標(biāo)值以及和光棚化處理有關(guān)的一些指導(dǎo)信息)進(jìn)行了變換和剪裁的頂點(diǎn)。2.2.4像素操作在OpenGL的渲染管線中,和單路徑的幾何數(shù)據(jù)相比,像素?cái)?shù)據(jù)所經(jīng)歷的流程有所不同。首先,來(lái)自系統(tǒng)內(nèi)存的一個(gè)數(shù)組中的像素進(jìn)行解包,從某種格式(像素的原始格式可能有多種)解包為適當(dāng)數(shù)量的數(shù)據(jù)成分。接著,這些數(shù)據(jù)被縮放、偏移,并根據(jù)一副像素圖進(jìn)行處理。處理結(jié)果先進(jìn)行截取,然后或者寫入到紋理內(nèi)存,或者發(fā)送到光棚化階段。如果像素?cái)?shù)據(jù)時(shí)從幀緩沖區(qū)讀取的,就對(duì)他們執(zhí)行像素轉(zhuǎn)換操作(縮放、偏移、映射和截取)。然后,這些結(jié)果被包裝為一種適當(dāng)?shù)母袷?,并返回到系統(tǒng)內(nèi)存的一個(gè)數(shù)組中。OpenGL有一種特殊的像素復(fù)制操作,可以把數(shù)據(jù)從幀緩沖區(qū)復(fù)制到幀緩沖區(qū)的其他位置或紋理內(nèi)存中。這樣,在數(shù)據(jù)寫入到紋理內(nèi)存或者寫回到幀緩沖區(qū)之前,只需要進(jìn)行一道像素轉(zhuǎn)換就可以了。2.2.5紋理裝配OpenGL應(yīng)用程序可以在幾何物體上應(yīng)用紋理圖像,使它們看上去更為逼真。如果需要使用多幅紋理圖像,把它們放在紋理對(duì)象中是一種明智的做法。這樣,就可以很方便地在他們之間進(jìn)行切換。有些OpenGL實(shí)現(xiàn)擁有一些特殊的資源,可以加速紋理的處理。這種資源可能是專用的,高性能的紋理內(nèi)存。如果確實(shí)擁有這種內(nèi)存,紋理對(duì)象可能會(huì)優(yōu)先進(jìn)行處理,以控制這種有限和寶貴的資源的使用。2.2.6光棚化光棚化就是把幾何數(shù)據(jù)和像素?cái)?shù)據(jù)轉(zhuǎn)換為片斷(fragment)的過(guò)程。每個(gè)片斷方塊對(duì)應(yīng)用于幀緩沖區(qū)中的一個(gè)像素。把頂點(diǎn)連接起來(lái)形成直線或者計(jì)算填充多邊形的內(nèi)部像素時(shí),需要考慮直線和多邊形的點(diǎn)畫模式,直線的寬度,點(diǎn)的大小,著色模型以及用于支持抗鋸齒處理的覆蓋計(jì)算。每個(gè)片斷方塊都將具有各自的顏色和深度值。2.2.7片斷操作在數(shù)據(jù)實(shí)際存儲(chǔ)到幀緩沖區(qū)之前,將要執(zhí)行一系列的操作。這些操作可能會(huì)修改甚至丟棄這些片斷。所有這些操作都可以被啟用或禁用。第一個(gè)可能遇到的操作是紋理化。在紋理內(nèi)存中為每個(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á)它的最終歸宿。2.3MFC概述MFC,微軟基礎(chǔ)類(MicrosoftFoundationClasses),用于在C++環(huán)境下編寫應(yīng)用程序的一個(gè)框架和引擎。該類庫(kù)提供一組通用的可重用的類庫(kù)供開(kāi)發(fā)人員使用。大部分類均從CObject直接或間接派生,只有少部分類例外。MFC類庫(kù)作為C++與Windows的接口,建立在Win32應(yīng)用程序編程接口API之上,封裝了大多數(shù)的API函數(shù),主要是API中與程序結(jié)構(gòu)相關(guān)的部分和最常用的部分。MFC還封裝了重要的Windows擴(kuò)展,如COM,ActiveX,ODBC和InternetAPIs,為這些難以編程實(shí)現(xiàn)的功能提供了簡(jiǎn)便方法。MFC中的各種類結(jié)合起來(lái)構(gòu)成了一個(gè)應(yīng)用程序框架,讓程序員在此基礎(chǔ)上來(lái)建立Windows下的應(yīng)用程序。MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。VisualC++提供了相應(yīng)的工具來(lái)完成這個(gè)工作:AppWizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于直觀地設(shè)計(jì)用戶界面;ClassWizard用來(lái)協(xié)助添加代碼到框架文件;最后進(jìn)行編譯,則通過(guò)類庫(kù)實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。在MFC編程中,入口函數(shù)WinMain()被封裝在MFC的應(yīng)用程序框架內(nèi),已經(jīng)不用也不可以再定義為另一個(gè)WinMain()函數(shù)。MFC編程最好的辦法是使用MFC的應(yīng)用程序向?qū)Чぞ逜ppWizard。AppWizard為程序員提供了一種快捷方便的工具來(lái)定制基于MFC的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來(lái)實(shí)現(xiàn)所需功能。MFC是一個(gè)編程框架,MFC中的各種類結(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è)輪廓。MicrosoftVisualC++提供了相應(yīng)的工具來(lái)完成這個(gè)工作:AppWizard可以用來(lái)生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard用來(lái)協(xié)助添加代碼到框架文件;最后,編譯,則通過(guò)類庫(kù)實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。MFC編程框架具有如下特點(diǎn):2.3.1封裝構(gòu)成MFC框架的是MFC類庫(kù)。MFC類庫(kù)是C++類庫(kù)。這些類或者封裝了Win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了OLE特性,或者封裝了ODBC和DAO數(shù)據(jù)訪問(wèn)的功能,等等,分述如下。(1)對(duì)Win32應(yīng)用程序編程接口的封裝用一個(gè)C++Object來(lái)包裝一個(gè)WindowsObject。例如:classCWnd是一個(gè)C++windowobject,它把Windowswindow(HWND)和Windowswindow有關(guān)的API函數(shù)封裝在C++windowobject的成員函數(shù)內(nèi),后者的成員變量m_hWnd就是前者的窗口句柄。(2)對(duì)應(yīng)用程序概念的封裝使用SDK編寫Windows應(yīng)用程序時(shí),總要定義窗口過(guò)程,登記WindowsClass,創(chuàng)建窗口,等等。MFC把許多類似的處理封裝起來(lái),替程序員完成這些工作。另外,MFC提出了以文檔-視圖為中心的編程模式,MFC類庫(kù)封裝了對(duì)它的支持。文檔是用戶操作的數(shù)據(jù)對(duì)象,視圖是數(shù)據(jù)操作的窗口,用戶通過(guò)它處理、查看數(shù)據(jù)。(3)對(duì)COM/OLE特性的封裝OLE建立在COM模型之上,由于支持OLE的應(yīng)用程序必須實(shí)現(xiàn)一系列的接口(Interface),因而相當(dāng)繁瑣。MFC的OLE類封裝了OLEAPI大量的復(fù)雜工作,這些類提供了實(shí)現(xiàn)OLE的更高級(jí)接口。(4)對(duì)ODBC功能的封裝以少量的能提供與ODBC之間更高級(jí)接口的C++類,封裝了ODBCAPI的大量的復(fù)雜的工作,提供了一種數(shù)據(jù)庫(kù)編程模式。2.3.2繼承首先,MFC抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是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派生。針對(duì)每種不同的對(duì)象,MFC都設(shè)計(jì)了一組類對(duì)這些對(duì)象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對(duì)象包括以下種類:窗口對(duì)象,基類是CWnd,派生了CView類;應(yīng)用程序?qū)ο?,基類是CwinThread;文檔對(duì)象,基類是Cdocument,等等。程序員將結(jié)合自己的實(shí)際,從適當(dāng)?shù)腗FC類中派生出自己的類,實(shí)現(xiàn)特定的功能,達(dá)到自己的編程目的。2.3.3虛擬函數(shù)和動(dòng)態(tài)約束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ù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來(lái)不現(xiàn)實(shí)。于是,MFC建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動(dòng)態(tài)約束問(wèn)題。這樣,通過(guò)虛擬函數(shù)和消息映射,MFC類提供了豐富的編程接口。程序員繼承基類的同時(shí),把自己實(shí)現(xiàn)的虛擬函數(shù)和消息處理函數(shù)嵌入MFC的編程框架。MFC編程框架將在適當(dāng)?shù)臅r(shí)候、適當(dāng)?shù)牡胤絹?lái)調(diào)用程序的代碼。本書將充分的展示MFC調(diào)用虛擬函數(shù)和消息處理函數(shù)的內(nèi)幕,讓讀者對(duì)MFC的編程接口有清晰的理解。2.3.4MFC的宏觀框架體系如前所述,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)用程序的模板,擴(kuò)展DLL應(yīng)用程序的模板,OLE/ACTIVEX應(yīng)用程序的模板,等等。這些模板都采用了以文檔-視為中心的思想,每一個(gè)模板都包含一組特定的類。典型的MDI應(yīng)用程序的構(gòu)成將在下一節(jié)具體討論。為了支持對(duì)應(yīng)用程序概念的封裝,MFC內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如,為了實(shí)現(xiàn)對(duì)DLL編程的支持和多線程編程的支持,MFC內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來(lái)管理一些重要信息。雖然,這些內(nèi)部處理對(duì)程序員來(lái)說(shuō)是透明的,但是,懂得和理解MFC內(nèi)部機(jī)制有助于寫出功能靈活而強(qiáng)大的程序??傊?,MFC封裝了Win32API,OLEAPI,ODBCAPI等底層函數(shù)的功能,并提供更高一層的接口,簡(jiǎn)化了Windows編程。同時(shí),MFC支持對(duì)底層API的直接調(diào)用。MFC提供了一個(gè)Windows應(yīng)用程序開(kāi)發(fā)模式,對(duì)程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等。框架或者由其本身處理事件,不依賴程序員的代碼;或者調(diào)用程序員的代碼來(lái)處理應(yīng)用程序特定的事件。MFC是C++類庫(kù),程序員就是通過(guò)使用、繼承和擴(kuò)展適當(dāng)?shù)念悂?lái)實(shí)現(xiàn)特定的目的。例如,繼承時(shí),應(yīng)用程序特定的事件由程序員的派生類來(lái)處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是C++對(duì)繼承的支持,對(duì)虛擬函數(shù)的支持,以及MFC實(shí)現(xiàn)的消息映射機(jī)制。2.4MFC編程框架用AppWizard產(chǎn)生一個(gè)MDI工程t(無(wú)OLE等支持),AppWizard創(chuàng)建了一系列文件,構(gòu)成了一個(gè)應(yīng)用程序框架。這些文件分四類:頭文件(.h),實(shí)現(xiàn)文件(.cpp),資源文件(.rc),模塊定義文件(.def),等。2.4.1構(gòu)成應(yīng)用程序?qū)ο笙聢D解釋了該應(yīng)用程序的結(jié)構(gòu),箭頭表示信息流向。圖2MDI應(yīng)用程序的構(gòu)成從CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd類對(duì)應(yīng)地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο蟆⑽臋n對(duì)象、視對(duì)象、主框架窗口對(duì)象和文檔邊框窗口對(duì)象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對(duì)這些類或者對(duì)象解釋如下。(1)應(yīng)用程序類應(yīng)用程序類派生于CWinApp?;诳蚣艿膽?yīng)用程序必須有且只有一個(gè)應(yīng)用程序?qū)ο?,它?fù)責(zé)應(yīng)用程序的初始化、運(yùn)行和結(jié)束。(2)邊框窗口類如果是SDI應(yīng)用程序,從CFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含視窗口;如果是MDI應(yīng)用程序,從CMDIFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含文檔邊框窗口。如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加CToolBar和CStatusBar類型的成員變量,以及在一個(gè)OnCreate消息處理函數(shù)中初始化這兩個(gè)控制窗口。邊框窗口用來(lái)管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預(yù)覽)。(3)文檔邊框窗口類文檔邊框窗口類從CMDIChildWnd類派生,MDI應(yīng)用程序使用文檔邊框窗口來(lái)包含視窗口。(4)文檔類文檔類從CDocument類派生,用來(lái)管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過(guò)文檔實(shí)現(xiàn)的。視窗口通過(guò)文檔對(duì)象來(lái)訪問(wèn)和更新數(shù)據(jù)。(5)視類視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對(duì)文檔的操作。(6)文檔模板類文檔模板類一般不需要派生。MDI應(yīng)用程序使用多文檔模板類CMultiDocTemplate;SDI應(yīng)用程序使用單文檔模板類CSingleDocTemplate。應(yīng)用程序通過(guò)文檔模板類對(duì)象來(lái)管理上述對(duì)象(應(yīng)用程序?qū)ο蟆⑽臋n對(duì)象、主邊框窗口對(duì)象、文檔邊框窗口對(duì)象、視對(duì)象)的創(chuàng)建。2.4.2構(gòu)成應(yīng)用程序的對(duì)象之間的關(guān)系圖3應(yīng)用程序的對(duì)象之間的關(guān)系用圖的形式可直觀地表示所涉及的MFC類的繼承或者派生關(guān)系,如圖所示意。圖所示的類都是從CObject類派生出來(lái)的;所有處理消息的類都是從CCmdTarget類派生的。如果是多文檔應(yīng)用程序,文檔模板使用CMultiDocTemplae,主框架窗口從CMdiFarmeWnd派生,它包含工具條、狀態(tài)欄和文檔框架窗口。文檔框架窗口從CMdiChildWnd派生,文檔框架窗口包含視,視從CView或其派生類派生。2.4.3構(gòu)成應(yīng)用程序的文件通過(guò)上述分析,可知AppWizard產(chǎn)生的MDI框架程序的內(nèi)容,所定義和實(shí)現(xiàn)的類。下面,從文件的角度來(lái)考察AppWizard生成了的源碼和作用什么。表1列出了AppWizard所生成的頭文件,表2列出了了AppWizard所生成的實(shí)現(xiàn)文件及其對(duì)頭文件的包含關(guān)系。表1AppWizard所生成的頭文件表2AppWizard所生成的實(shí)現(xiàn)文件從表2中的包含關(guān)系一欄可以看出:CTApp的實(shí)現(xiàn)用到所有的用戶定義對(duì)象,包含了他們的定義;CView的實(shí)現(xiàn)用到CTdoc;其他對(duì)象的實(shí)現(xiàn)只涉及自己的定義;當(dāng)然,如果增加其他操作,引用其他對(duì)象,則要包含相應(yīng)的類的定義文件。2.5基于OpenGL+MFC的三維模擬的編程環(huán)境配置1.創(chuàng)建MFC項(xiàng)目(1)創(chuàng)建項(xiàng)目文件。選擇File|New菜單項(xiàng),新建一個(gè)基于對(duì)話框的項(xiàng)目文件MyDlgOpenGL;(2)修改對(duì)話框模板。刪除對(duì)話框中的靜態(tài)文本,調(diào)整控件的位置;2.配置基于OpenGL+MFC的開(kāi)發(fā)環(huán)境(1)將glu.dll,glu32.dll,glut.dll,glut32.dll,opengl32.dll文件拷貝到操作系統(tǒng)WINNT/System32目錄下。(2)將gl.h,glaux.h,glu.h,glut.h拷貝到MicrosoftVisualStudio/VC98/Include/GL目錄中中。(3)將glaux.lib,glu32.lib,glut32.lib,opengl32.lib拷貝到MicrosoftVisualStudio/VC98/Lib目錄中。(4)添加OpenGL開(kāi)發(fā)庫(kù)文件到項(xiàng)目在編譯程序的時(shí)候選擇Project|Setting菜單,在Link標(biāo)簽中的Object/librarymodules編輯框中輸入“opengl32.lib,glut32.lib,glu32.lib,glaux.lib”;(5)創(chuàng)建新類,添加消息映射。選擇View|ClassWizard菜單項(xiàng),打開(kāi)MFC對(duì)話框,在AddClass之中選擇New,以便添加一個(gè)新類COpenGL,且該類的基類選擇genericCWnd;最后利用MFCClassWizard為COpenGL類添加消息WM_CREATE,WM_PAINT的映射。3.初始化OpenGL:(設(shè)置像素格式、創(chuàng)建OpenGLdc、rc,設(shè)置OpenGL視口變換)①設(shè)置像素格式:為CMyTestView類添加成員函數(shù)BOOLbSetupPixelFormat(void),用于與OpenGL相關(guān)的設(shè)置/*定義像素存儲(chǔ)格式*/PIXELFORMATDESCRIPTORpfd={sizeof(PIXELFORMATDESCRIPTOR),//pfd結(jié)構(gòu)的大小1,//版本號(hào)PFD_DRAW_TO_WINDOW|//支持在窗口中繪圖PFD_SUPPORT_OPENGL|//支持OpenGLPFD_TYPE_RGBA,//RGBA顏色模式24,//24位顏色深度0,0,0,0,0,0,//忽略顏色位0,//沒(méi)有非透明度緩存0,//忽略移位位0,//無(wú)累加緩存0,0,0,0,//忽略累加位32,//32位深度緩存0,//無(wú)模板緩存0,//無(wú)輔助緩存PFD_MAIN_PLANE,//主層0,//保留0,0,0//忽略層,可見(jiàn)性和損毀掩模};intpixelformat;if((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0){MessageBox("ChoosePixelFormatfailed");returnFALSE;}if(SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE){MessageBox("SetPixelFormatfailed");returnFALSE;}returnTRUE;②初始化創(chuàng)建OpenGLRC:hrc=wglCreateContext(m_pDC->GetSafeHdc());wglMakeCurrent(m_pDC->GetSafeHdc(),hrc);并添加WM_CREATE消息處理函數(shù),然后在OnCreate函數(shù)中進(jìn)行調(diào)用://TODO:AddyourspecializedcreationcodehereInit();③初始化的獲取dc:m_pDC=newCClientDC(this);ASSERT(m_pDC!=NULL);④設(shè)置OpenGL視錐體即投影變換矩陣glMatrixMode(GL_PROJECTION);//在修改前重設(shè)坐標(biāo)系glLoadIdentity();⑤設(shè)置視口變換://Settheviewport視口tobetheentirewindowglViewport(0,0,w,h);gluPerspective(45,ratio,1,1000);⑥設(shè)置OpenGL模型變換glMatrixMode(GL_MODELVIEW);glLoadIdentity();4為實(shí)現(xiàn)應(yīng)用程序邏輯,在該系統(tǒng)中為CMyTestView類添加成員函數(shù)voidInit();voidDrawFountain();voidnormalize(structpoint*V);voidvect_mult(structpoint*A,structpoint*B,structpoint*C);voidDeleteParticles();voidMoveParticles();voidAddParticles();voidLoadTexture(char*fn,intt_num);其中voidDrawFountain();用于繪制噴泉。構(gòu)造代碼如下:voidCMyFountainView::DrawFountain(){ intj; structparticle*tempp; structpointvectd,vectl; floatalpha,ttx,ttz;}其噴泉粒子結(jié)構(gòu)體代碼如下:structparticle{floatt;//粒子的生命期floatv;//粒子運(yùn)動(dòng)的速度f(wàn)loatd;//粒子運(yùn)動(dòng)的方向floatx,y,z;//粒子的位置坐標(biāo)floatxd,zd;//粒子的X和Z方向增加值chartype;//粒子類型(運(yùn)動(dòng)或淡化)floata;//淡化alpha值structparticle*next,*prev;}5.清理工作:(析構(gòu)函數(shù)中釋放dc,rc指針)voidCMyTestView::OnDestroy()//清理工作{HGLRChrc;hrc=::wglGetCurrentContext();::wglMakeCurrent(NULL,NULL);if(hrc)::wglDeleteContext(hrc);if(m_pDC)deletem_pDC;CView::OnDestroy();}

3粒子系統(tǒng)的原理和關(guān)鍵技術(shù)3.1計(jì)算機(jī)圖形學(xué)原理計(jì)算機(jī)圖形學(xué)是運(yùn)用計(jì)算機(jī)產(chǎn)生、存儲(chǔ)、處理物體和物理模型及它們的圖畫的一門學(xué)科??偟膩?lái)說(shuō),造型技術(shù)、真實(shí)感圖形繪制技術(shù)與人機(jī)交互技術(shù)構(gòu)成了計(jì)算機(jī)圖形學(xué)的主要研究?jī)?nèi)容。目前,計(jì)算機(jī)圖形學(xué)解決與研究的問(wèn)題有:(1)圖形表示和處理的數(shù)學(xué)方法及其實(shí)現(xiàn)的算法;(2)設(shè)計(jì)一個(gè)好的圖形軟件系統(tǒng):(3)設(shè)計(jì)與實(shí)際應(yīng)用相結(jié)合的圖形應(yīng)用系統(tǒng)。用計(jì)算機(jī)生成三維形體圖形,是計(jì)算機(jī)圖形學(xué)的基本研究?jī)?nèi)容。三維計(jì)算機(jī)圖形的生成一般需要經(jīng)歷三維物體造型、取景變換、視域裁剪、消除隱藏面及可見(jiàn)光亮度計(jì)算等步驟。物體最初定義在自己的局部坐標(biāo)系中,經(jīng)過(guò)模型變換,它以一定的形狀、尺寸存在于場(chǎng)景坐標(biāo)系的某個(gè)位置。在場(chǎng)景坐標(biāo)系中指定物體的表面屬性和光照屬性,給出視點(diǎn)的位置和視線方向,進(jìn)行視域變換,置入視點(diǎn)坐標(biāo)系中。在視點(diǎn)坐標(biāo)系中,進(jìn)行背面剔除、視域四棱錐裁剪。指定屏幕的有關(guān)參數(shù),進(jìn)行透視變換,把物體放入屏幕坐標(biāo)系。再進(jìn)行光柵化、隱藏面剔除和光亮度計(jì)算,最后進(jìn)行顯示。其中在對(duì)自然景物的計(jì)算機(jī)模擬方面粒子系統(tǒng)得到了廣泛的應(yīng)用。3.2粒子系統(tǒng)的理論粒子系統(tǒng)是不規(guī)則模糊物體建模及其圖像生成的一種方法,粒子系統(tǒng)的基本原理是采用大量的、具有一定生命和屬性的微小粒子圖元作為基本元素來(lái)繪制不規(guī)則的模糊物體對(duì)象.在粒子系統(tǒng)中,粒子圖元的形狀可以是小球、立方體、正四面體或其它的形體。此外每個(gè)粒子還具有大小、顏色、透明度、位置、運(yùn)動(dòng)速度和運(yùn)動(dòng)方向、生命周期等屬性。粒子在系統(tǒng)中要經(jīng)過(guò)“產(chǎn)生”、“運(yùn)動(dòng)”和“消亡”三個(gè)階段,在這三個(gè)階段中粒子的大小和形狀隨時(shí)間變化,其它性質(zhì)如粒子的透明度顏色和運(yùn)動(dòng)都將隨機(jī)變化,從而充分體現(xiàn)出不規(guī)則物體的動(dòng)態(tài)性和隨機(jī)性。粒子系統(tǒng)理論主要由以下5部分組成[27]:1.物質(zhì)的粒子組成假設(shè)。粒子系統(tǒng)中,把運(yùn)動(dòng)的模糊物體看作由有限的具有確定屬性的流動(dòng)粒子所組成的集合,這些粒子以連續(xù)或離散的方式充滿它所處的空間,并處于不斷的運(yùn)動(dòng)狀態(tài),粒子在空間和時(shí)間上具有一定的分布。2.粒子獨(dú)立關(guān)系假設(shè)。這里包含兩個(gè)意思,一是粒子系統(tǒng)中各粒子不與場(chǎng)景中任何其它物體相交,二是粒子之間不存在相交關(guān)系,并且粒子是不可穿透的。3.粒子的屬性假設(shè)。系統(tǒng)中的每個(gè)粒子并不是抽象的,它們都具有一系列的屬性,比如質(zhì)量屬性、存在的空間位置屬性、外觀屬性(如顏色、亮度、形狀、尺寸等)、運(yùn)動(dòng)屬性(如速度、加速度等)、生存屬性(生命期),其中顏色、亮度等屬性隨著時(shí)間不斷地發(fā)生變化。4.粒子的生命機(jī)制。粒子系統(tǒng)中的每一個(gè)粒子都具有一定的生命周期,在一定的時(shí)間周期內(nèi),粒子經(jīng)歷新生、活動(dòng)和消亡三個(gè)基本生命歷程。5.粒子的運(yùn)動(dòng)機(jī)制。粒子在存活期間始終是按一定的方式運(yùn)動(dòng)的。粒子系統(tǒng)中,每一個(gè)粒子都要經(jīng)歷一個(gè)產(chǎn)生、發(fā)展和消亡的過(guò)程。生成粒子系統(tǒng)某瞬間畫面的基本步驟是:(1)生成新粒子加入到系統(tǒng)中(2)賦予每一個(gè)新粒子以一定的屬性(3)刪除那些已經(jīng)超過(guò)其生存期的粒子(4)根據(jù)粒子的動(dòng)態(tài)屬性對(duì)粒子進(jìn)行移動(dòng)和變換(5)繪制并顯示由有生命的粒子組成的圖形3.3粒子系統(tǒng)的基本模型粒子系統(tǒng)的基本模型包括粒子的生成,粒子屬性,粒子運(yùn)動(dòng)變化,粒子的消亡和粒子的繪制。如圖4圖4粒子系統(tǒng)實(shí)現(xiàn)粒子生命機(jī)制的邏輯流程3.3.1粒子的生成粒子生成的時(shí)間、空間與數(shù)量是研究的主要內(nèi)容。1.粒子生成的時(shí)間通常粒子系統(tǒng)在初始化的時(shí)候就生成了一定數(shù)量的粒子,這部分粒子很大程度上決定了模糊物體的形態(tài)。在系統(tǒng)運(yùn)行的過(guò)程中,每隔一定時(shí)間周期生成新的粒子并加入系統(tǒng)中。2.粒子生成的空間確定了粒子的生成時(shí)間后,要確定的是粒子生成的空間。粒子生成的空間是指系統(tǒng)選取一定的區(qū)域范圍來(lái)生成新的粒子,根據(jù)粒子系統(tǒng)所模擬的對(duì)象不同而有所區(qū)別,通常來(lái)說(shuō)是限定在球體區(qū)域或球面區(qū)域內(nèi)。3.粒子的數(shù)量粒子的數(shù)量是粒子系統(tǒng)的重要參數(shù),它關(guān)乎著粒子系統(tǒng)模擬效果的真實(shí)程度以及系統(tǒng)運(yùn)行的實(shí)時(shí)性。粒子的數(shù)量過(guò)大會(huì)耗費(fèi)過(guò)多的系統(tǒng)資源,影響系統(tǒng)的實(shí)時(shí)性;粒子數(shù)量過(guò)少必然就降低了系統(tǒng)模擬的逼真程度。粒子的產(chǎn)生通常由隨機(jī)函數(shù)來(lái)控制,在Reeves的粒子系統(tǒng)中定義了兩種方法[2]:第一種是平均粒子數(shù)衡量法。這種方法通過(guò)限定每一幀的粒子的平均數(shù)和方差來(lái)限定產(chǎn)生的實(shí)際粒子數(shù)。第二種是物體面積衡量法。這種方法是指產(chǎn)生的粒子數(shù)目依靠屏幕的大小,即設(shè)計(jì)者控制產(chǎn)生在每個(gè)單位屏幕內(nèi)的平均粒子和方差。這種方法可以避免使用大量的粒子來(lái)模擬屏幕上投影面積比較小的景物,避免計(jì)算機(jī)資源的浪費(fèi)。3.3.2粒子屬性初始化對(duì)于每個(gè)粒子,系統(tǒng)都要賦予其一定的屬性,粒子的屬性決定了粒子的狀態(tài);對(duì)于模擬不同對(duì)象的粒子,粒子的屬性沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),通常是在滿足基本視覺(jué)效果的前提下建立比較簡(jiǎn)單的模型,主要包括外觀屬性、空間屬性、運(yùn)動(dòng)屬性、生命屬性等。1.外觀屬性外觀屬性包括粒子的形狀、尺寸和顏色,它們共同決定了系統(tǒng)對(duì)不規(guī)則模糊物體模擬的逼真程度。(1)粒子形狀:Reeves[2]的經(jīng)典粒子系統(tǒng)將粒子的初始形狀設(shè)置為點(diǎn),即使用點(diǎn)光源進(jìn)行建模,在實(shí)現(xiàn)時(shí)只需用一個(gè)像素來(lái)顯示點(diǎn),這是最簡(jiǎn)單的粒子系統(tǒng)模型;在較復(fù)雜的粒子系統(tǒng)中,單個(gè)粒子的形狀可以采用線段、多邊形、圓形、橢圓形和球形等復(fù)雜素來(lái)取得較好的視覺(jué)效果。(2)粒子尺寸:粒子尺寸的大小是與粒子形狀同時(shí)被確定的,粒子尺寸越大,生成的圖形真實(shí)感越差,但由于計(jì)算量減少,系統(tǒng)的實(shí)時(shí)性提高了;相反如果減小粒子的尺寸,則提高了圖像的分辨率,增強(qiáng)了真實(shí)感,但計(jì)算量也將同時(shí)增加,因此導(dǎo)致實(shí)時(shí)性下降。在具體實(shí)現(xiàn)的過(guò)程中,粒子尺寸的大小體現(xiàn)了圖像真實(shí)感和系統(tǒng)實(shí)時(shí)性的折衷。(3)粒子顏色:粒子的初始顏色由系統(tǒng)設(shè)定,粒子從生成到消亡的過(guò)程中,粒子顏色從初始顏色變成消亡顏色,體現(xiàn)了顏色分布的物理特性。粒子的初始顏色分量包括粒子的三原色(R,G,B)和粒子的透明度值(Alpha)2.空間屬性空間屬性指的是粒子的初始位置,即發(fā)射時(shí)的位置,這些位置構(gòu)成各種形態(tài)的發(fā)射器。粒子的初始位置由粒子的生成區(qū)域決定,分別由粒子在三維空間中的坐標(biāo)(x,y,z)確定粒子在空間的具體方位,由粒子的本地坐標(biāo)軸旋轉(zhuǎn)所得到的角度(angX,angY,angZ)確定粒子在空間中的方向。如圖5以球形粒子為例描述了粒子的初始位置的幾何意義。圖5粒子的初始位置3.運(yùn)動(dòng)屬性運(yùn)動(dòng)屬性是指粒子的運(yùn)動(dòng)速度,粒子的初始運(yùn)動(dòng)速度由大小和方向兩部分組成:公式(2-1)如下InitialVelocity=MeanVelocity+Rand()*VarVelocity(2-1)MeanVelocity和VarVelocity分別表示粒子的平均速度和隨機(jī)速度變化范圍。粒子的速度方向由粒子系統(tǒng)模擬的物體物理特征確定,通常是某個(gè)固定方向或某個(gè)區(qū)域內(nèi)的隨機(jī)方向。4.生命屬性新粒子生成時(shí)都被系統(tǒng)賦予了生命周期(Lifetime),生命周期是用來(lái)計(jì)算粒子在系統(tǒng)中的存活時(shí)間,隨著時(shí)間的推移,不斷有粒子消亡同時(shí)不斷有新粒子生成,生命周期(粒子壽命)用粒子在系統(tǒng)中存活的幀數(shù)來(lái)表示。如下式所示:Lifetimei+l=Lifetimei-AttenuationPerframeΔt其中AttenuationPerframe是每幀粒子的生命衰減率,表示每經(jīng)過(guò)一幀圖像減少的生命周期數(shù)。3.3.3粒子的運(yùn)動(dòng)狀態(tài)粒子動(dòng)態(tài)描述了粒子在三維空間中的狀態(tài)變化過(guò)程,狀態(tài)變化包括粒子空間位置、速度、形態(tài)和顏色的改變。某一幀粒子空間位置可以由其速度和上一幀的位置得到。為了模擬復(fù)雜環(huán)境中粒子的運(yùn)動(dòng),可以引入“場(chǎng)”的概念,如重力場(chǎng)、風(fēng)力場(chǎng)、電磁場(chǎng)等,通過(guò)控制這些場(chǎng)的參數(shù),就可以控制場(chǎng)中粒子的運(yùn)動(dòng)軌跡。粒子顏色、透明度和形態(tài)的變化通過(guò)控制相應(yīng)變化參數(shù)來(lái)實(shí)現(xiàn)。P為位置,V為速度,A為加速度,粒子的狀態(tài)變化可用公式(2-2)、公式(2-3)計(jì)算:V(t+△t)=V(t)+A(t)△t(2-2)P(t+△t)=P(t)+V(t)△t(2-3)3.3.4粒子的消亡粒子產(chǎn)生后,經(jīng)過(guò)一定的時(shí)間間隔,由于某種原因從系統(tǒng)中被刪除的過(guò)程稱為粒子的消亡過(guò)程。粒子消亡的原因主要有兩種:一種是因?yàn)榱W拥纳芷谝呀?jīng)減少到零,說(shuō)明粒子壽命己盡。粒子生命周期的遞減可以按照每一幀來(lái)遞減,也可以按照物理時(shí)間來(lái)遞減。另一種是粒子的生命還存在,但是由于其他限制條件而夭折。這些限制條件一般為超出顯示區(qū)域、顏色與背景色融合或粒子透明度已經(jīng)等于零等。3.3.5粒子的繪制當(dāng)某一幀的粒子狀態(tài)被全部確定以后,粒子控制機(jī)制即調(diào)用繪制函數(shù)將其送往顯示緩存,粒子的繪制與普通圖形體素如多邊形和曲線的繪制并沒(méi)有多少區(qū)別,也存在遮擋、陰影和反走樣等問(wèn)題。由于粒子存在于三維空間中,每個(gè)粒子都帶有其自身的深度信息,在繪制時(shí)也要解決遮擋、陰影和部分透明物體重疊等繪制規(guī)則圖形體素要解決的問(wèn)題,并且基于粒子系統(tǒng)的不規(guī)則物體可以與基于面片的規(guī)則物體存在于同一場(chǎng)景中。在Reeves的粒子系統(tǒng)中,為了簡(jiǎn)化繪制算法,作了以下兩條假設(shè):首先假設(shè)粒子系統(tǒng)中的所有粒子都以點(diǎn)光源(粒子光源)繪制,這樣假設(shè)的目的是避免在解決遮擋和碰撞時(shí)對(duì)大量粒子進(jìn)行z軸上的深度排序,從而減少了大量機(jī)器時(shí)間。在以點(diǎn)光源形式繪制粒子時(shí),映射在任何像素上的光強(qiáng)和顏色都可以看成所有映射在該點(diǎn)的粒子的光強(qiáng)和顏色的簡(jiǎn)單疊加,從而避免了大量排序操作。此外這條假設(shè)中包含了一條隱含假設(shè),即粒子光源的光強(qiáng)獨(dú)立于粒子到視點(diǎn)的空間距離,光強(qiáng)不隨粒子到視點(diǎn)距離的增加而減小,因此映射到同一像素上的各粒子的光強(qiáng)可以不必經(jīng)過(guò)深度排序而直接簡(jiǎn)單疊加。其次,假設(shè)繪制時(shí)只考慮不規(guī)則模糊物體本身,即粒子系統(tǒng)中的各個(gè)粒子與虛擬環(huán)境中的其它規(guī)則物體不會(huì)出現(xiàn)交錯(cuò)、融合與碰撞檢測(cè)計(jì)算,因此只對(duì)系統(tǒng)中的粒子進(jìn)行繪制。

4系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)4.1系統(tǒng)的關(guān)鍵技術(shù)分析應(yīng)用粒子系統(tǒng)進(jìn)行噴泉模型的仿真,設(shè)計(jì)路線是確定噴泉粒子的生存條件,和基本屬性,抽象出噴泉粒子的運(yùn)動(dòng)規(guī)律,最后提出繪制算法。增強(qiáng)了模擬效果的真實(shí)感與實(shí)時(shí)性。為了達(dá)到噴泉現(xiàn)象良好的模擬效果,首先要構(gòu)造合適的坐標(biāo)系。假想觀察者的視點(diǎn)位于屏幕正前方,以噴泉出水的管嘴的中心位置為原點(diǎn)O,設(shè)置X軸正向?yàn)閺淖笾劣业姆较颍琘軸正向?yàn)閺南轮辽系姆较?,Z軸正向?yàn)閺睦镏镣獾姆较颉?.1.1噴泉現(xiàn)象的運(yùn)動(dòng)規(guī)律噴泉模型由一定數(shù)量水柱構(gòu)成的、總體形態(tài)近似于拋物線y=ax+bx+c繞y坐標(biāo)軸一周所形成的旋轉(zhuǎn)體的噴泉模型。假設(shè)水珠在上升和下降過(guò)程中,y方向只受重力作用,空氣阻力和其他外力忽略不計(jì),粒子在y方向運(yùn)動(dòng)軌跡則可表示為生存時(shí)間的函數(shù):y=-1/2*g*T2+H(4-1)其中g(shù)表示重力加速度,表示噴泉水珠粒子在Y方向能到達(dá)的最高高度。粒子在x和z方向的位置由(4-2)主(4-3)式確定。x=x0+∫vxdt(4-2)z=z0+∫vzdt(4-3)其中,x。,z。是粒子在x和z方向的初始位置,vx和vy是粒子在x和z方向的速度。在計(jì)算粒子位置(4-2)和(4-3)式時(shí),本文采用等加速度運(yùn)動(dòng)的方法來(lái)實(shí)現(xiàn)離散情況下物體運(yùn)動(dòng)狀態(tài)的簡(jiǎn)化計(jì)算。等加速度運(yùn)動(dòng)的計(jì)算方法如(4-4)和(4-5)式所示。vn=vn-1+a△t(4-4)sn=sn-1+vn△t(4-5)其中,Sn是時(shí)刻n的粒子位置,Vn是時(shí)刻n的粒子速度,a是粒子的加速度,△t是離散的時(shí)間隔。等加速度運(yùn)動(dòng)方法不僅運(yùn)算簡(jiǎn)單,而且精確率也較高。等加速度運(yùn)動(dòng)方法可使用效率更高的遞推運(yùn)算來(lái)計(jì)算相鄰時(shí)刻粒子的速度和位置。該粒子的運(yùn)動(dòng)函數(shù)為:voidCMyFountainView::MoveParticles(){ structparticle*tempp; intj; for(j=0;j<3;j++) { tempp=fn[j]; while(tempp) { if(tempp->type==0)//如果粒子處于運(yùn)動(dòng)狀態(tài) { tempp->x+=tempp->xd; tempp->z+=tempp->zd; tempp->y=-(9.8*(tempp->t*tempp->t/4))/2+122.5;//計(jì)算粒子的高度H=gt^2/2 tempp->t+=0.1;//增加粒子壽命 if(tempp->y<0)tempp->type=1;//如果粒子位于地面 }else//粒子位于地面 { tempp->y=-(9.8*(tempp->t*tempp->t/4))/2+122.5; tempp->a-=0.1;//粒子淡化 } tempp=tempp->next;//下一個(gè)粒子 } }}4.1.2噴泉現(xiàn)象特征1)水珠粒子:定義為實(shí)數(shù)域上的一個(gè)n維向量,表示為:Rn={Position,Speed,Accelerate_speed,Direction,Color,Bright,Lifetime,Type,F(xiàn)low},Rn表示某一粒子的性質(zhì)和狀態(tài),包括:粒子的空間位置、運(yùn)動(dòng)速度及加速度、運(yùn)動(dòng)方向、顏色、亮度、生存期、運(yùn)動(dòng)狀態(tài)等屬性。它是組成噴泉的基本粒子。2)水柱:在隨機(jī)過(guò)程作用于水珠粒子各屬性后形成的、具有相同初始噴射方向的水珠粒子集合,記為Fv,可以簡(jiǎn)單理解為從噴泉噴口噴射出的一條水線。3)噴泉體:由一定數(shù)目的水柱構(gòu)成的集合F,F(xiàn)={q|q∈Fv}。4)幀:將所有需要顯示的水珠粒子繪制一遍的過(guò)程就定義為一幀。噴泉現(xiàn)象軌跡沿著3條水柱做拋物線自由落體運(yùn)動(dòng)。其中粒子各方向的速度代碼如下: tempp->d=(float)(rand()%400)/100-2;//粒子方向 tempp->xd=cos((tempp->d*3.14159)/180)*tempp->v/4; tempp->zd=sin((tempp->d*3.14159)/180)*tempp->v;//粒子的x和z方向增加值 tempp->x+=tempp->xd; tempp->z+=tempp->zd; tempp->y=-(9.8*(tempp->t*tempp->t/4))/2+122.5;//計(jì)算粒子的高度H=gt^2/24.2系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)根據(jù)粒子系統(tǒng)的工作原理,并設(shè)置了CmyFountainView、point、particle等相關(guān)粒子類。首先確定噴泉粒子的初始屬性,然后對(duì)粒子進(jìn)行操作,將有生命的噴泉水滴粒子繪制在視口中即實(shí)現(xiàn)噴泉模型模擬。4.2.1噴泉粒子系統(tǒng)的邏輯視圖圖6是噴泉系統(tǒng)模型實(shí)現(xiàn)的工作流程。圖6噴泉系統(tǒng)模型實(shí)現(xiàn)的工作流程系統(tǒng)流程分析如下:(1)創(chuàng)建并初始化噴泉粒子;(2)初始化粒子的屬性;(3)通過(guò)更改粒子的位置坐標(biāo)和噴射方向以及生命周期,根據(jù)運(yùn)動(dòng)

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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)論