<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > 基于MFC和OpenGL的噴泉模擬實(shí)現

基于MFC和OpenGL的噴泉模擬實(shí)現

作者: 時(shí)間:2012-10-29 來(lái)源:網(wǎng)絡(luò ) 收藏

 由于自然環(huán)境中大部分景物(如云彩、火焰、煙霧、瀑布、雪花等特效)具有不規則性、復雜性與隨機性,且隨著(zhù)時(shí)間變化形狀會(huì )隨之變化,對其進(jìn)行逼真的實(shí)時(shí)十分困難,需要大量的計算量和數據量。在虛擬環(huán)境中,自然景物的視覺(jué)效果直接影響到觀(guān)察者對周?chē)h(huán)境的感知,所以開(kāi)發(fā)一個(gè)既能滿(mǎn)足逼真度要求,又能實(shí)時(shí)顯示的粒子系統是非常必要的。自從公布以來(lái),有關(guān)圖形學(xué)方面的書(shū)籍、論文等資料就層出不窮,如何利用Open GL開(kāi)發(fā)出具有一定水平的計算機圖形程序就成為眾多學(xué)者的追求目標。在Visual C++中,既可利用Win32編程,也可利用編程,兩者各有特點(diǎn),本文就如何利用Open GL在中開(kāi)發(fā)出一個(gè)簡(jiǎn)單的噴泉程序作一個(gè)簡(jiǎn)單探討。
1 繪圖環(huán)境初始化
 是一個(gè)跨平臺的三維圖形庫,可在Windows、Unix和Mac等平臺上運行。而Visual C++完善的基本類(lèi)庫和應用向導AppWizard使得開(kāi)發(fā)一個(gè)復雜的應用程序變得輕松自如。如果將兩者結合,便可開(kāi)發(fā)出較高水平的Windows下三維圖形應用程序[1]。
 在3D游戲的渲染過(guò)程中,傳統的建模方法一般只適用于外形比較規則的形體,對于那些像雨、雪、瀑布、噴泉以及火焰等沒(méi)有固定形狀,甚至要隨著(zhù)外部環(huán)境或者其他因素的改變而改變的物質(zhì)建模,傳統的方法就顯得無(wú)能為力了[2]。1983年REEVES W T提出了一種新的建模方法,稱(chēng)為模糊物體建模,該方法就是粒子系統,它的出現正好解決了上述問(wèn)題[3]。
 OpenGL函數庫和操作系統無(wú)關(guān),它有自己的獨特設計,與Windows的圖像設備接口GDI模型以及多數MFC應用程序的建立方法不太一致。在Windows系統中,這樣的一組函數稱(chēng)為wiggle函數,每個(gè)wiggle函數的前綴是“wgl”。
 在Win32下,首先必須重新設置畫(huà)圖窗口的像素格式,使其符合OpenGL對像素格式的需要。為此,聲明一個(gè)PIXELFORMATDESCRIPTOR結構的變量,并適當設置其結構成員的值,使其支持OpenGL及其顏色模式。再以此變量為參數調用ChoosePixelFormat(),分配一個(gè)像素格式號,然后調用SetPixelFormat()將其設置為當前像素格式。
 完成了像素格式的重新設置后,需要為OpenGL建立繪制描述表(Render Context)。繪制描述表的作用類(lèi)似于Windows中的設備描述表(Device Context)。只有建立了繪制描述表RC后,OpenGL才能調用繪圖原語(yǔ)在窗口中做出圖形。Win32API提供了幾個(gè)操作繪制描述表的函數,包括建立、復制、使用、刪除和查詢(xún)等,它們都以wgl為詞頭。RC是以線(xiàn)程為單位的,每一個(gè)線(xiàn)程必須使用一個(gè)RC作為當前RC才能執行OpenGL繪圖原語(yǔ)。
 wglCreateContext()是建立繪制描述表的函數,它以一個(gè)指向GDI設備描述表的句柄為參數,返回一個(gè)與此設備描述表相關(guān)聯(lián)的繪制描述表句柄。在以此2句柄為參數調用函數wglMakeCurrent(),使RC成為線(xiàn)程當前使用的RC,完成Windows下OpenGL繪圖環(huán)境的初始化過(guò)程[4]。
2 建立OpenGL單文檔應用程序框架
 使用Visual C++的AppWizard和Class Wizard可以很容易地生成一個(gè)使用MFC的OpenGL單文檔應用程序框架,名稱(chēng)為MyFountain。
2.1 PreCreateWindow方法
 BOOL CMySDOpenGLView:: PreCreateWindow(CREATESTRUCT cs)
{
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
 使視窗口具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS風(fēng)格,確保成功地設置像素格式。
2.2 添加消息響應函數
 利用MFC ClassWizard為CMySDOpenGLView類(lèi)添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER的響應函數。
 首先在OnCreate方法中初始化OpenGL,并設置定時(shí)器。
 然后在OnTimer響應函數中添加定時(shí)器響應函數和場(chǎng)景更新命令,使得程序按照定時(shí)器設置的時(shí)間步長(cháng)進(jìn)行中斷,并調用OnDraw對場(chǎng)景進(jìn)行更新、渲染。
 第三步,添加OnSize函數對用戶(hù)進(jìn)行窗口調整的消息進(jìn)行響應,并即時(shí)調整窗口的大小[5]。
 最后,當關(guān)閉窗口時(shí),將值NULL(或0)賦值給wglMakeCurrent()的參數hRC后,調用wglDeleteContext()刪除繪制描述表,并刪除調色板和定時(shí)器。
3 基于粒子系統的噴泉
 構造可視化系統的建模技術(shù)大致可以分為兩類(lèi):幾何建模和行為建模。幾何建模處理物體的幾何和形狀的表示,研究圖形數據結構等基本問(wèn)題;行為建模處理物體運動(dòng)和行為的描述。
一個(gè)粒子系統由大量稱(chēng)為粒子的簡(jiǎn)單體素構成。每個(gè)粒子有一組屬性,如位置、速度、顏色和生命期。一個(gè)粒子究竟有什么樣的屬性,主要取決于具體的應用。粒子的初值由隨機過(guò)程產(chǎn)生。粒子往往由位于空間的某個(gè)地方的粒子源產(chǎn)生。
 粒子系統也利用了隨機過(guò)程,并常將物體的幾何和行為組合在一個(gè)有機模型中。
一個(gè)粒子系統是不斷進(jìn)化的。在生命期的每一刻,都要完成以下4步工作:
?。?)粒子源產(chǎn)生新粒子。產(chǎn)生任意數目的新粒子,它們的初始屬性由隨機過(guò)程控制。每個(gè)粒子都有一個(gè)生命期,如果某些粒子不應刪除,則可以賦予它無(wú)限長(cháng)的生命期。
?。?)更新現有粒子屬性。例如,若粒子有位置和速度屬性,在模擬重力場(chǎng)中的運動(dòng)時(shí),可以如下更新粒子的位置和速度屬性:
v=v+gts=s+vt
在該步中,粒子的生命期遞減一個(gè)時(shí)間步。
?。?)刪除“死”粒子。檢查粒子的生命期,若為0則將粒子從系統中刪除。
?。?)繪制粒子。顯示粒子系統中所有現存的粒子。
在一般情況下,粒子的幾何特征十分簡(jiǎn)單,可以采用一個(gè)像素或小的多邊形來(lái)代表[6]。
3.1 粒子數據結構的定義
 粒子數據結構的定義如下:
struct particle
{
float t; //粒子的生命期
float vel; //粒子運動(dòng)的速度
float dir; //粒子運動(dòng)的方向
float x,y,z; //粒子的位置坐標
float xd,zd; //粒子的X和Z方向增加值
char type; //粒子類(lèi)型(運動(dòng)或淡化)
float a; //淡化alpha值
struct particle*next,*prev;
};
3.2 繪制噴泉
3.2.1 先構造一個(gè)場(chǎng)景

 由于重點(diǎn)是噴泉,因此簡(jiǎn)單構造一個(gè)模擬的地面能突出噴泉就可以了。實(shí)現代碼如下:
 glClear(GL_COLOR_BUFFER_BIT);
 glLoadIdentity();
 glBindTexture(GL_TEXTURE_2D,texture[1]);
 a+=0.2;
 gluLookAt(cam.x,cam.y,cam.z,0,0,0,upv.x,upv.y, upv.z);
3.2.2 噴泉的渲染處理
 噴泉的渲染處理過(guò)程主要是利用了OpenGL的特征函數[7]和方法,主要進(jìn)行了兩方面的處理:(1)將噴泉模型渲染成紋理文件[8];(2)采用透明紋理渲染技術(shù)[9]。
3.2.3 噴泉的實(shí)現
 在構造了簡(jiǎn)單的地面場(chǎng)景后,取以原點(diǎn)為中心的圓周上的均勻點(diǎn)序列作為噴泉的噴射點(diǎn),按照上述提到的繪制方法[10]即完成了噴泉的動(dòng)態(tài)模擬。噴泉系統模擬的主要關(guān)鍵代碼在于向內存中添加渲染粒子,即函數AddParticles(),之后粒子將按照預定的軌道運行,其主要實(shí)現代碼如下:
//添加新的粒子
void CMyFountainView::AddParticles()
{
struct particle*tempp;
int i, j;

for (j=0;j18;j++)
for (i=0;i2;i++)
{
tempp=(struct particle*)malloc(sizeof(struct particle));
if (fn[j])fn[j]->prev=tempp;
tempp->next=fn[j];
fn[j]=tempp;

tempp->t=-9.9; //粒子的生命期
tempp->v=(float)(rand()%200000)/100000+1;
// 粒子速度
tempp->d=(float)(rand()%400)/100-2;
//粒子方向
tempp->x=20*cos((j*3.14159)/180); //開(kāi)始位置的坐標
tempp->y=0;
tempp->z=20*sin((j*3.14159)/180);
tempp->xd=cos((tempp->d*3.14159)/180)*tempp->v/4;
tempp->zd=sin((tempp->d*3.14159)/180)*tempp->v;
tempp->type=0; //粒子狀態(tài)為運動(dòng)
tempp->a=1; //粒子淡化
}
}
 噴泉的效果顯示如圖1所示。

本文引用地址:http://dyxdggzs.com/article/185609.htm

16638104582282.jpg

 通過(guò)改變程序中alpha(圓的內接正多邊形圓心角)的值,可以改變噴泉粒子流的股數。噴泉的粒子流粗細可通過(guò)改變矢量的乘積來(lái)實(shí)現,通過(guò)改變“vectl.x*=5;vectl.y*=5;vectl.z*=5;”等式右邊的數值可以控制,圖1就是改為“5;3;2;”的結果。
 通過(guò)上述的試驗比較可知,噴泉粒子流的股數和每股粒子流的粒子數目都會(huì )影響到噴泉模擬效果的真實(shí)感[11]。
 越來(lái)越多的人注意到使用Visual C++和OpenGL開(kāi)發(fā)三維圖形動(dòng)畫(huà)軟件的有利之處,但是有關(guān)OpenGL的資料大多都是介紹基本的編程指南或者一些基礎的原理或方法,卻很少有大型的與應用有關(guān)的編程案例,而且有也大多都是基于Win32的類(lèi)來(lái)實(shí)現一些簡(jiǎn)單的圖形功能,介紹MFC與OpenGL連接的資料卻少之又少,本文主要是在MFC下實(shí)現了一個(gè)簡(jiǎn)單的噴泉模擬程序,主要的創(chuàng )新點(diǎn)是分析了MFC下消息響應的內部機制,所以希望本次的探索能對以后利用MFC開(kāi)發(fā)出更高效的程序有所幫助。
參考文獻
[1] 和平鴿工作室.OpenGl高級編程與可視化系統開(kāi)發(fā)(高級編程篇)[M].北京:中國水利水電出版社,2007.
[2] 徐明亮,盧紅星,王琬.OpenGl游戲編程[M].北京:機械工業(yè)出版社,2008.
[3] REEVES W T. Particle systems-a technique for modeling a class of fuzzy objects[J]. ACM Transations on Graphics(TOG), 1983,2(2):359-376.
[4] 周建龍,肖春.計算機圖形學(xué)理論與OpenGl編程實(shí)踐[M].廣州:華南理工大學(xué)出版社,2007.
[5] 孫鑫,余安萍.VC++深入詳解[M].北京:電子工業(yè)出版社,2008.
[6] 雷曉,胡倩.基于Direct3D的粒子系統設計[J].微計算機信息,2010(11-1).
[7] 張芹,吳慧中,謝雋毅.基于粒子系統的火焰模型及其生產(chǎn)方法研究[J].計算機輔助設計與圖形學(xué)報,2001,13(1):78-82.
[8] PHONG B T. Illunimation for computer generated pictures[J].Communications of the ACM,1975,18(6):311-317.
[9] 侯陽(yáng),迪克.三維圖形動(dòng)畫(huà)編程實(shí)例[M].海洋出版社,1993.
[10] 楊春雨.基于粒子系統的噴泉動(dòng)畫(huà)模擬[J].長(cháng)春:吉林大學(xué)出版社,2008.
[11] 凌云,儲林波.用Visual C++中的MFC和OpenGl建立三維圖形應用環(huán)境[J].微型機與應用,1998,17(4):8-10.

矢量控制相關(guān)文章:矢量控制原理


關(guān)鍵詞: OpenGL MFC 模擬

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>