《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于MFC和OpenGL的噴泉模擬實現
基于MFC和OpenGL的噴泉模擬實現
來源:微型機與應用2012年第17期
梅章明,張秀山
(海軍工程大學 計算機工程系,湖北 武漢 430033)
摘要: 粒子系統是模擬噴泉的一種有效方法。首先使用Visual C++的基本類庫MFC和Open GL圖形庫建立面向對象的三維圖形應用程序的開發環境,然后再利用各種計算過程生成模型中的各個體素,利用粒子系統建模的優點,實現噴泉的模擬。
Abstract:
Key words :

摘  要: 粒子系統是模擬噴泉的一種有效方法。首先使用Visual C++的基本類庫MFC和Open GL圖形庫建立面向對象的三維圖形應用程序的開發環境,然后再利用各種計算過程生成模型中的各個體素,利用粒子系統建模的優點,實現噴泉的模擬。
關鍵詞: 三維圖形編程;OpenGL;MFC類庫;粒子系統

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

 由于重點是噴泉,因此簡單構造一個模擬的地面能突出噴泉就可以了。實現代碼如下:
 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的特征函數[7]和方法,主要進行了兩方面的處理:(1)將噴泉模型渲染成紋理文件[8];(2)采用透明紋理渲染技術[9]。
3.2.3 噴泉的實現
 在構造了簡單的地面場景后,取以原點為中心的圓周上的均勻點序列作為噴泉的噴射點,按照上述提到的繪制方法[10]即完成了噴泉的動態模擬。噴泉系統模擬的主要關鍵代碼在于向內存中添加渲染粒子,即函數AddParticles(),之后粒子將按照預定的軌道運行,其主要實現代碼如下:
    //添加新的粒子
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);       //開始位置的坐標
  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; //粒子狀態為運動
  tempp->a=1; //粒子淡化
 }
}
 噴泉的效果顯示如圖1所示。

 

 

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

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲精品综合精品自拍| 欧美日韩福利| 亚洲高清视频在线| 久久久爽爽爽美女图片| 亚洲一区二区动漫| 欧美性做爰猛烈叫床潮| 国产毛片久久| 欧美三级资源在线| 国产精品久久久久久久浪潮网站| 国产日韩欧美一区二区| 亚洲欧美日韩系列| 亚洲国产精品一区二区尤物区| 夜夜爽www精品| 91久久国产自产拍夜夜嗨| 欧美大片一区| 欧美激情一区二区三区在线视频| 欧美日韩高清免费| 欧美日本亚洲| 亚洲砖区区免费| 亚洲免费播放| 国产精品一香蕉国产线看观看| 亚洲精品乱码久久久久久蜜桃麻豆| 影音先锋成人资源站| 久久永久免费| 久久久久这里只有精品| 欧美亚州在线观看| 日韩视频在线一区二区三区| 久久精品99国产精品| 亚洲视频自拍偷拍| 一色屋精品视频免费看| 国产精品看片你懂得| 亚洲国产精品精华液2区45| 亚洲成人影音| 欧美国产在线视频| 午夜国产欧美理论在线播放| 欧美日韩一区二区三区四区在线观看| 欧美ab在线视频| 欧美精品粉嫩高潮一区二区| 欧美黄色大片网站| 一本色道久久综合亚洲精品高清| 亚洲一区中文字幕在线观看| 国产精品伦理| 亚洲电影自拍| 亚洲成人影音| 欧美精品在线观看91| 国产精品美腿一区在线看| 久久精品中文字幕一区| 久久不射网站| 在线播放中文字幕一区| 亚洲成人在线| 韩国av一区二区三区| 国产视频一区欧美| 在线免费观看成人网| 久久久99精品免费观看不卡| 国产日韩在线看片| 久久精品视频网| 亚洲国产欧美日韩另类综合| 欧美一区二区三区免费视频| 欧美一区在线看| 亚洲一区二区三区欧美| 免费日韩av| 欧美亚洲一区三区| 欧美与欧洲交xxxx免费观看| 欧美日韩精选| 亚洲小说春色综合另类电影| 国产精品a久久久久| 久久一综合视频| 亚洲在线免费观看| 国产精品一区二区你懂得| 欧美日本一区二区视频在线观看| 一区二区三区国产| 久久嫩草精品久久久精品| 亚洲片在线资源| 激情成人综合网| 亚洲一区二区三区免费观看| 国产精品网站在线播放| 韩国v欧美v日本v亚洲v| 国产一区二区视频在线观看| 亚洲网站在线| 在线观看亚洲a| 国产在线成人| 亚洲无人区一区| 国产精品视频九色porn| 久久久欧美一区二区| 亚洲综合社区| 久久性色av| 欧美日韩不卡在线| 欧美日韩成人在线播放| 老司机一区二区三区| 欧美性猛交视频| 国内一区二区三区| 国产亚洲欧洲一区高清在线观看| 亚洲第一在线综合在线| 国产精品va在线播放我和闺蜜| 欧美日本成人| 国产精品网站视频| 激情视频一区二区三区| 欧美精品午夜视频| 欧美激情女人20p| 久久久久久久综合色一本| 亚洲国产欧洲综合997久久| 亚洲九九九在线观看| 国产精品久久久久久久7电影| 亚洲精品中文字幕在线观看| 欧美国产日韩免费| 伊人成年综合电影网| 亚洲激情在线观看视频免费| 国产精品久久久久久久久久三级| 欧美精品日韩综合在线| 亚洲动漫精品| 国产综合精品| 欧美大成色www永久网站婷| 亚洲制服欧美中文字幕中文字幕| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产视频直播| 欧美寡妇偷汉性猛交| 在线观看日韩www视频免费| 欧美日本一区二区视频在线观看| 亚洲欧洲精品成人久久奇米网| 日韩一区二区免费看| 欧美韩日一区二区三区| 亚洲一区二区三区高清不卡| 亚洲已满18点击进入久久| 狼狼综合久久久久综合网| 亚洲永久在线| 欧美天天在线| 久久久久久久久久久久久女国产乱| 99精品久久久| 欧美日韩国产精品一区| 韩国av一区| 老司机免费视频一区二区三区| 亚洲高清成人| 国产精自产拍久久久久久蜜| 一二三区精品| 欧美成人精品福利| 午夜宅男久久久| 欧美成人性网| 国产九色精品成人porny| 亚洲人午夜精品免费| 欧美一区二区三区视频在线| 欧美一区国产在线| 欧美成人视屏| 99re这里只有精品6| 亚洲精品久久久久| 欧美精品一区二区三区蜜臀| 久久一区国产| 一级成人国产| 久久超碰97人人做人人爱| 欧美一区二区三区四区视频| 欧美日韩少妇| 欧美日韩成人综合天天影院| 亚洲日本免费| 欧美一区二粉嫩精品国产一线天| 国产视频一区二区在线观看| 久久免费国产精品1| 欧美一区二区三区在| 国产亚洲欧美日韩日本| 老司机aⅴ在线精品导航| 在线观看日韩精品| 欧美精品自拍偷拍动漫精品| 欧美在线二区| 国产精品国产福利国产秒拍| 亚洲综合大片69999| 亚洲福利精品| 一区二区毛片| 国产精品国产三级国产专区53| 欧美伦理一区二区| 亚洲国产日韩一区| 久久久久久一区二区三区| 在线观看日韩av电影| 一本色道久久88精品综合| 亚洲大片一区二区三区| 国产一区美女| 欧美影院成人| 在线看国产日韩| 一本综合久久| 久久久中精品2020中文| 国产婷婷色一区二区三区四区| 麻豆精品91| 欧美成人黄色小视频| 午夜精品久久久久久久99黑人| 国产亚洲精品一区二区| 欧美亚州一区二区三区| 国产精品任我爽爆在线播放| 一区二区三区精品在线| 亚洲视频高清| 亚洲在线免费观看| 亚洲精品乱码久久久久久日本蜜臀| 欧美日韩另类丝袜其他| 日韩一二在线观看| 亚洲成色www8888| 欧美99在线视频观看| 国产综合一区二区| 欧美激情女人20p| 欧美日韩国内自拍| 欧美在线www| 国产欧美日韩专区发布| 亚洲一区二区三区精品视频| 99国产精品久久久久久久成人热| 一区二区欧美在线| 免费视频一区二区三区在线观看| 国产一区二区三区在线观看网站| 欧美成人一区二区三区| 久久噜噜亚洲综合| 国产色婷婷国产综合在线理论片a| 一区二区三区www| 亚洲综合第一页| 国产精品美女999| 国产一区观看| 一区二区日本视频| 欧美影片第一页| 亚洲欧美日韩国产一区二区三区| 久久久噜噜噜久久| 欧美大片免费看| 亚洲在线观看| 欧美三级电影一区| 最新国产成人av网站网址麻豆| 欧美日韩网址| 国产伦精品一区二区三区免费迷| 狠狠爱综合网| 久久9热精品视频| 国产精品乱码妇女bbbb| 国产精品一区在线播放| 欧美欧美全黄| 亚洲日本va午夜在线电影| 亚洲欧美精品在线| 欧美另类女人| 模特精品裸拍一区| 国产午夜精品全部视频在线播放| 亚洲夫妻自拍| 欧美韩日亚洲| 国产亚洲欧洲997久久综合| 国产私拍一区| 国产精品视频午夜| 国产欧美视频一区二区| 亚洲大胆人体视频| 欧美日韩免费网站| 最新亚洲视频| 久久成人这里只有精品| 亚洲国产日韩美| 亚洲伦理自拍| 国产一区二区三区久久| 国产欧美韩日| 欧美一级淫片aaaaaaa视频| 欧美一区二粉嫩精品国产一线天| 国产精品自拍视频| 欧美日韩免费网站| 国产色爱av资源综合区| 老鸭窝亚洲一区二区三区| 久久综合九色九九| 永久免费毛片在线播放不卡| 亚洲一区二区影院| 美日韩精品免费观看视频| 香蕉av777xxx色综合一区| 国产精品超碰97尤物18| 老牛嫩草一区二区三区日本| 欧美一区二区高清在线观看| 久久久一区二区三区| 国产精品久久久久国产精品日日| 国产精自产拍久久久久久| 日韩一二三区视频| 国产性色一区二区| 暖暖成人免费视频| 国产日韩欧美不卡在线| 国产精品视频午夜| 夜夜嗨av一区二区三区中文字幕| 国产区亚洲区欧美区| 亚洲国产人成综合网站| 欧美在线观看天堂一区二区三区| 亚洲精品一区二区三区不| 久久久青草婷婷精品综合日韩| 亚洲精品一区二区三区蜜桃久| 亚洲淫片在线视频| 一区二区日韩伦理片| 午夜精品久久久久久久99水蜜桃| 欧美v日韩v国产v| 国产乱肥老妇国产一区二| 亚洲国产欧美一区二区三区同亚洲| 国产精品久久久久9999| 国产精品久久二区| 性xx色xx综合久久久xx| 欧美黄色aaaa| 国产一区二区福利| 亚洲精品一区二区三区av| 欧美精品在线极品| 99视频一区| 欧美成人69av| 亚洲国产一区二区视频| 欧美午夜理伦三级在线观看| 久久精品99国产精品酒店日本| 国产精品久久久久毛片软件| 国语自产精品视频在线看8查询8| 亚洲女优在线| 一区二区亚洲精品国产| 久久久九九九九| 国产精品久久亚洲7777| 亚洲电影免费在线观看| 欧美阿v一级看视频| 亚洲国产成人精品久久久国产成人一区| 久久视频免费观看| 亚洲大黄网站| 亚洲欧洲一区| 久久综合色88| 亚洲一区bb| 欧美二区在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美中文字幕视频| 国产一区二区三区四区三区四| 国产精品久久久久久亚洲调教| 久久婷婷综合激情| 久久伊人亚洲| 欧美激情综合五月色丁香小说| 欧美日韩午夜激情| 国内伊人久久久久久网站视频| 亚洲国产精品传媒在线观看| 亚洲国产裸拍裸体视频在线观看乱了| 性色av一区二区怡红| 欧美久久久久中文字幕| 久久精品免费电影| 国产视频精品网| 亚洲一区中文| 国产精品毛片a∨一区二区三区| 亚洲欧洲在线视频| 久久―日本道色综合久久| 国产精品久久久久秋霞鲁丝| 国产日韩av在线播放| 亚洲综合色激情五月| 亚洲欧美一区二区三区在线|