0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用Open GL在MFC中實現(xiàn)噴泉模擬應(yīng)用程序的開發(fā)設(shè)計

電子設(shè)計 ? 來源:微型機與應(yīng)用 ? 作者:梅章明,張秀山 ? 2020-10-13 10:34 ? 次閱讀

由于自然環(huán)境中大部分景物(如云彩、火焰、煙霧、瀑布、雪花等特效)具有不規(guī)則性、復(fù)雜性與隨機性,且隨著時間變化形狀會隨之變化,對其進(jìn)行逼真的實時模擬十分困難,需要大量的計算量和數(shù)據(jù)量。在虛擬環(huán)境中,自然景物的視覺效果直接影響到觀察者對周圍環(huán)境的感知,所以開發(fā)一個既能滿足逼真度要求,又能實時顯示的粒子系統(tǒng)是非常必要的。自從OpenGL公布以來,有關(guān)圖形學(xué)方面的書籍、論文等資料就層出不窮,如何利用Open GL開發(fā)出具有一定水平的計算機圖形程序就成為眾多學(xué)者的追求目標(biāo)。在Visual C++中,既可利用Win32編程,也可利用MFC編程,兩者各有特點,本文就如何利用Open GL在MFC中開發(fā)出一個簡單的噴泉模擬程序作一個簡單探討。

1 OpenGL繪圖環(huán)境初始化

OpenGL是一個跨平臺的三維圖形庫,可在Windows、Unix和Mac等平臺上運行。而Visual C++完善的基本類庫MFC和應(yīng)用向?qū)ppWizard使得開發(fā)一個復(fù)雜的應(yīng)用程序變得輕松自如。如果將兩者結(jié)合,便可開發(fā)出較高水平的Windows下三維圖形應(yīng)用程序。

在3D游戲的渲染過程中,傳統(tǒng)的建模方法一般只適用于外形比較規(guī)則的形體,對于那些像雨、雪、瀑布、噴泉以及火焰等沒有固定形狀,甚至要隨著外部環(huán)境或者其他因素的改變而改變的物質(zhì)建模,傳統(tǒng)的方法就顯得無能為力了[2]。1983年REEVES W T提出了一種新的建模方法,稱為模糊物體建模,該方法就是粒子系統(tǒng),它的出現(xiàn)正好解決了上述問題。

OpenGL函數(shù)庫和操作系統(tǒng)無關(guān),它有自己的獨特設(shè)計,與Windows的圖像設(shè)備接口GDI模型以及多數(shù)MFC應(yīng)用程序的建立方法不太一致。在Windows系統(tǒng)中,這樣的一組函數(shù)稱為wiggle函數(shù),每個wiggle函數(shù)的前綴是“wgl”。

在Win32下,首先必須重新設(shè)置畫圖窗口的像素格式,使其符合OpenGL對像素格式的需要。為此,聲明一個PIXELFORMATDESCRIPTOR結(jié)構(gòu)的變量,并適當(dāng)設(shè)置其結(jié)構(gòu)成員的值,使其支持OpenGL及其顏色模式。再以此變量為參數(shù)調(diào)用ChoosePixelFormat(),分配一個像素格式號,然后調(diào)用SetPixelFormat()將其設(shè)置為當(dāng)前像素格式。

完成了像素格式的重新設(shè)置后,需要為OpenGL建立繪制描述表(Render Context)。繪制描述表的作用類似于Windows中的設(shè)備描述表(Device Context)。只有建立了繪制描述表RC后,OpenGL才能調(diào)用繪圖原語在窗口中做出圖形。Win32API提供了幾個操作繪制描述表的函數(shù),包括建立、復(fù)制、使用、刪除和查詢等,它們都以wgl為詞頭。RC是以線程為單位的,每一個線程必須使用一個RC作為當(dāng)前RC才能執(zhí)行OpenGL繪圖原語。

wglCreateContext()是建立繪制描述表的函數(shù),它以一個指向GDI設(shè)備描述表的句柄為參數(shù),返回一個與此設(shè)備描述表相關(guān)聯(lián)的繪制描述表句柄。在以此2句柄為參數(shù)調(diào)用函數(shù)wglMakeCurrent(),使RC成為線程當(dāng)前使用的RC,完成Windows下OpenGL繪圖環(huán)境的初始化過程[4]。

2 建立OpenGL單文檔應(yīng)用程序框架

使用Visual C++的AppWizard和Class Wizard可以很容易地生成一個使用MFC的OpenGL單文檔應(yī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)格,確保成功地設(shè)置像素格式。

2.2 添加消息響應(yīng)函數(shù)

利用MFC ClassWizard為CMySDOpenGLView類添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER的響應(yīng)函數(shù)。

首先在OnCreate方法中初始化OpenGL,并設(shè)置定時器。

然后在OnTimer響應(yīng)函數(shù)中添加定時器響應(yīng)函數(shù)和場景更新命令,使得程序按照定時器設(shè)置的時間步長進(jìn)行中斷,并調(diào)用OnDraw對場景進(jìn)行更新、渲染。

第三步,添加OnSize函數(shù)對用戶進(jìn)行窗口調(diào)整的消息進(jìn)行響應(yīng),并即時調(diào)整窗口的大?。?]。

最后,當(dāng)關(guān)閉窗口時,將值NULL(或0)賦值給wglMakeCurrent()的參數(shù)hRC后,調(diào)用wglDeleteContext()刪除繪制描述表,并刪除調(diào)色板和定時器。

3 基于粒子系統(tǒng)的噴泉模擬

構(gòu)造可視化系統(tǒng)的建模技術(shù)大致可以分為兩類:幾何建模和行為建模。幾何建模處理物體的幾何和形狀的表示,研究圖形數(shù)據(jù)結(jié)構(gòu)等基本問題;行為建模處理物體運動和行為的描述。

一個粒子系統(tǒng)由大量稱為粒子的簡單體素構(gòu)成。每個粒子有一組屬性,如位置、速度、顏色和生命期。一個粒子究竟有什么樣的屬性,主要取決于具體的應(yīng)用。粒子的初值由隨機過程產(chǎn)生。粒子往往由位于空間的某個地方的粒子源產(chǎn)生。

粒子系統(tǒng)也利用了隨機過程,并常將物體的幾何和行為組合在一個有機模型中。

一個粒子系統(tǒng)是不斷進(jìn)化的。在生命期的每一刻,都要完成以下4步工作:

(1)粒子源產(chǎn)生新粒子。產(chǎn)生任意數(shù)目的新粒子,它們的初始屬性由隨機過程控制。每個粒子都有一個生命期,如果某些粒子不應(yīng)刪除,則可以賦予它無限長的生命期。

(2)更新現(xiàn)有粒子屬性。例如,若粒子有位置和速度屬性,在模擬重力場中的運動時,可以如下更新粒子的位置和速度屬性:

v=v+gts=s+vt

在該步中,粒子的生命期遞減一個時間步。

(3)刪除“死”粒子。檢查粒子的生命期,若為0則將粒子從系統(tǒng)中刪除。

(4)繪制粒子。顯示粒子系統(tǒng)中所有現(xiàn)存的粒子。

在一般情況下,粒子的幾何特征十分簡單,可以采用一個像素或小的多邊形來代表[6]。

3.1 粒子數(shù)據(jù)結(jié)構(gòu)的定義

粒子數(shù)據(jù)結(jié)構(gòu)的定義如下:

struct particle

{

float t; //粒子的生命期

float vel; //粒子運動的速度

float dir; //粒子運動的方向

float x,y,z; //粒子的位置坐標(biāo)

float xd,zd; //粒子的X和Z方向增加值

char type; //粒子類型(運動或淡化)

float a; //淡化alpha值

struct particle*next,*prev;

};

3.2 繪制噴泉

3.2.1 先構(gòu)造一個場景

由于重點是噴泉,因此簡單構(gòu)造一個模擬的地面能突出噴泉就可以了。實現(xiàn)代碼如下:

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 噴泉的渲染處理

噴泉的渲染處理過程主要是利用了OpenGL的特征函數(shù)[7]和方法,主要進(jìn)行了兩方面的處理:(1)將噴泉模型渲染成紋理文件[8];(2)采用透明紋理渲染技術(shù)[9]。

3.2.3 噴泉的實現(xiàn)

在構(gòu)造了簡單的地面場景后,取以原點為中心的圓周上的均勻點序列作為噴泉的噴射點,按照上述提到的繪制方法[10]即完成了噴泉的動態(tài)模擬。噴泉系統(tǒng)模擬的主要關(guān)鍵代碼在于向內(nèi)存中添加渲染粒子,即函數(shù)AddParticles(),之后粒子將按照預(yù)定的軌道運行,其主要實現(xiàn)代碼如下:

//添加新的粒子

void CMyFountainView::AddParticles()

{

struct particle*tempp;

int i, j;

for (j=0;j《18;j++)

for (i=0;i《2;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); //開始位置的坐標(biāo)

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)為運動

tempp-》a=1; //粒子淡化

}

}

噴泉的效果顯示如圖1所示。

通過改變程序中alpha(圓的內(nèi)接正多邊形圓心角)的值,可以改變噴泉粒子流的股數(shù)。噴泉的粒子流粗細(xì)可通過改變矢量的乘積來實現(xiàn),通過改變“vectl.x*=5;vectl.y*=5;vectl.z*=5;”等式右邊的數(shù)值可以控制,圖1就是改為“5;3;2;”的結(jié)果。

通過上述的試驗比較可知,噴泉粒子流的股數(shù)和每股粒子流的粒子數(shù)目都會影響到噴泉模擬效果的真實感[11]。

越來越多的人注意到使用Visual C++和OpenGL開發(fā)三維圖形動畫軟件的有利之處,但是有關(guān)OpenGL的資料大多都是介紹基本的編程指南或者一些基礎(chǔ)的原理或方法,卻很少有大型的與應(yīng)用有關(guān)的編程案例,而且有也大多都是基于Win32的類來實現(xiàn)一些簡單的圖形功能,介紹MFC與OpenGL連接的資料卻少之又少,本文主要是在MFC下實現(xiàn)了一個簡單的噴泉模擬程序,主要的創(chuàng)新點是分析了MFC下消息響應(yīng)的內(nèi)部機制,所以希望本次的探索能對以后利用MFC開發(fā)出更高效的程序有所幫助。

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7372

    瀏覽量

    87635
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2102

    瀏覽量

    73453
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3237

    瀏覽量

    57547
收藏 人收藏

    評論

    相關(guān)推薦

    MFC 程序

    處理;消息處理函數(shù),根據(jù)消息的類型與各控件的屬性,點綴整個窗口;MFC程序設(shè)計,為了設(shè)計
    發(fā)表于 10-11 22:13

    利用Open GLMFC開發(fā)出一個簡單的噴泉模擬程序探討

    Open GL開發(fā)出具有一定水平的計算機圖形程序就成為眾多學(xué)者的追求目標(biāo)。Visual C++
    發(fā)表于 07-17 07:21

    怎樣用vs2008去開發(fā)一種MFC應(yīng)用程序

    怎樣用vs2008去開發(fā)一種MFC應(yīng)用程序?MFC應(yīng)用程序有何功能?
    發(fā)表于 09-30 06:12

    利用lpc2104開發(fā)應(yīng)用程序時哪幾個需要在.c文件實現(xiàn)?

    利用 lpc2104 開發(fā)應(yīng)用程序時, Os_call_ARM.s,Os_call.c 兩個文件,那幾個函數(shù)需要在匯編
    發(fā)表于 02-24 15:18

    TMS320C6713DSP音樂噴泉控制系統(tǒng)的應(yīng)用

    TMS320C6713DSP音樂噴泉控制系統(tǒng)的應(yīng)用 音樂噴泉是現(xiàn)代科技與藝術(shù)的綜合,利用噴泉
    發(fā)表于 10-04 09:43 ?1485次閱讀

    利用OPC實現(xiàn)VC應(yīng)用程序與PLC的數(shù)據(jù)交換

    利用OPC實現(xiàn)VC應(yīng)用程序與PLC的數(shù)據(jù)交換   VC(Visual  C++)是功能強大的一種Windows應(yīng)用程序可視化軟件開發(fā)
    發(fā)表于 04-17 18:04 ?4856次閱讀
    <b class='flag-5'>利用</b>OPC<b class='flag-5'>實現(xiàn)</b>VC<b class='flag-5'>應(yīng)用程序</b>與PLC的數(shù)據(jù)交換

    利用FTP實現(xiàn)應(yīng)用程序的遠(yuǎn)程更新

    FTP (File Transfer Protocol),是用于Internet上的控制文件的雙向傳輸?shù)膮f(xié)議。同時,它也是一個應(yīng)用程序。本方案主要介紹如何利用網(wǎng)絡(luò)(以太網(wǎng)、GPRS上網(wǎng)),通過FTP協(xié)議來實現(xiàn)
    發(fā)表于 06-09 16:08 ?46次下載

    MFC原理與方法

    )微軟基礎(chǔ)類就是這樣一個由Microsoft公司設(shè)計的類庫。采用MFC方式編程提高了Windows應(yīng)用程序開發(fā)效率,但由于MFC應(yīng)用程序結(jié)
    發(fā)表于 04-19 14:52 ?8次下載

    C語言MFC制作剪刀石頭布游戲資料合集應(yīng)用程序免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言MFC制作剪刀石頭布游戲資料合集應(yīng)用程序免費下載。
    發(fā)表于 07-23 08:00 ?20次下載

    海為PLC音樂噴泉實現(xiàn)噴泉的聲、光、水完美控制設(shè)計

    音樂噴泉集光、色、音于一身,即根據(jù)音樂的特殊要素來控制噴泉水泵的運行和轉(zhuǎn)速變化,結(jié)合燈光的變化而形成噴泉,選用海為PLC對噴泉控制系統(tǒng)進(jìn)行控制,通過
    發(fā)表于 08-15 08:46 ?3349次閱讀

    利用USBXpress開發(fā)包簡化應(yīng)用程序實現(xiàn)USB通信設(shè)計

    的準(zhǔn)備工作,USBXpress開發(fā)包完全可以實現(xiàn)USB通信的所有功能。本文介紹USB通信開發(fā)的全過程,以及開發(fā)過程中需要注意的事項。(主要
    的頭像 發(fā)表于 01-14 08:02 ?2579次閱讀
    <b class='flag-5'>利用</b>USBXpress<b class='flag-5'>開發(fā)</b>包簡化<b class='flag-5'>應(yīng)用程序</b><b class='flag-5'>實現(xiàn)</b>USB通信設(shè)計

    vc++應(yīng)用程序和使用vc++設(shè)計的MFC計時器和計算機程序免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是vc++應(yīng)用程序和使用vc++設(shè)計的MFC計時器和計算機程序免費下載。
    發(fā)表于 12-24 08:00 ?15次下載
    vc++<b class='flag-5'>應(yīng)用程序</b>和使用vc++設(shè)計的<b class='flag-5'>MFC</b>計時器和計算機<b class='flag-5'>程序</b>免費下載

    Django應(yīng)用程序開發(fā)設(shè)計Django模板的方法

    本文中,我將介紹Django應(yīng)用程序開發(fā)設(shè)計Django模板的方法。目的是保持Django應(yīng)用程序
    的頭像 發(fā)表于 07-29 15:44 ?1832次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應(yīng)用程序開發(fā)。在這篇文章,我們將重點介紹MFC的多線程編程。 多線程編程
    的頭像 發(fā)表于 12-01 14:29 ?1377次閱讀

    花樣噴泉控制的PLC梯形圖實現(xiàn)

    噴泉廣泛用于廣場、車站、公園等各種公共和休閑娛樂場所。噴泉控制采用PLC,就可以通過改變PLC程序,來改變噴泉的造型及各種不同顏色燈光的
    的頭像 發(fā)表于 03-15 14:10 ?1711次閱讀
    花樣<b class='flag-5'>噴泉</b>控制<b class='flag-5'>中</b>的PLC梯形圖<b class='flag-5'>實現(xiàn)</b>