《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 設(shè)計(jì)應(yīng)用 > 基于粒子系統(tǒng)的位置可控有聲煙花模擬
基于粒子系統(tǒng)的位置可控有聲煙花模擬
來(lái)源:微型機(jī)與應(yīng)用2013年第9期
李 海,汪繼文
(安徽大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,安徽 合肥 230601)
摘要: 對(duì)煙花粒子系統(tǒng)模型和燃放原理進(jìn)行了詳細(xì)的分析,在VC++和OpenGL開(kāi)發(fā)工具基礎(chǔ)上,利用紋理映射、色彩混合等技術(shù)對(duì)動(dòng)態(tài)煙花進(jìn)行仿真模擬。加入了音頻技術(shù),并通過(guò)鼠標(biāo)注冊(cè)回調(diào)函數(shù)對(duì)煙花燃放的位置加以控制。實(shí)驗(yàn)結(jié)果表明,煙花模型的實(shí)時(shí)性逼真性、可控性和靈活性得以加強(qiáng)。
Abstract:
Key words :

摘  要: 對(duì)煙花粒子系統(tǒng)模型和燃放原理進(jìn)行了詳細(xì)的分析,在VC++和OpenGL開(kāi)發(fā)工具基礎(chǔ)上,利用紋理映射、色彩混合等技術(shù)對(duì)動(dòng)態(tài)煙花進(jìn)行仿真模擬。加入了音頻技術(shù),并通過(guò)鼠標(biāo)注冊(cè)回調(diào)函數(shù)對(duì)煙花燃放的位置加以控制。實(shí)驗(yàn)結(jié)果表明,煙花模型的實(shí)時(shí)性逼真性、可控性和靈活性得以加強(qiáng)。
關(guān)鍵詞: 粒子系統(tǒng);位置可控;音頻效果

 1983年,由REEVES W T等人提出的粒子系統(tǒng)繪制算法被認(rèn)為是迄今為止模擬不規(guī)則模糊物體最為成功的算法[1],使得具有不規(guī)則幾何形狀、內(nèi)在不確定性且運(yùn)動(dòng)具有隨機(jī)性的模糊物體的虛擬仿真模擬上了一個(gè)新的臺(tái)階。目前,國(guó)內(nèi)已經(jīng)有很多研究者采用粒子系統(tǒng)對(duì)自然景物進(jìn)行成功模擬,如王曉娟對(duì)禮花進(jìn)行了模擬[2],肖何等人成功地進(jìn)行了噴泉仿真[3]。本文在以上理論的基礎(chǔ)上,通過(guò)VC++和OpenGL開(kāi)發(fā)工具,利用鼠標(biāo)注冊(cè)回調(diào)等函數(shù)[4]對(duì)煙花燃放的位置加以控制,并加入了音頻技術(shù),從視覺(jué)和聽(tīng)覺(jué)兩個(gè)方面上進(jìn)一步增強(qiáng)了煙花爆炸模擬的靈活性、逼真性和沉浸感。
1 粒子系統(tǒng)基本原理
 粒子系統(tǒng)不是一個(gè)簡(jiǎn)單的靜態(tài)模型,而是一種過(guò)程計(jì)算模型。粒子系統(tǒng)是由許多簡(jiǎn)單形狀的微小粒子(如球體、橢球、立方體、點(diǎn)、線等)作為基本元素聚集起來(lái)形成一個(gè)不規(guī)則的模糊物體,并以這些粒子充滿物體,使其呈現(xiàn)各式各樣的形狀,從而構(gòu)成的一個(gè)封閉的系統(tǒng)。
組成粒子系統(tǒng)的每個(gè)粒子都有一組屬性,包括位置、運(yùn)動(dòng)速度、運(yùn)動(dòng)加速度、形狀、大小、顏色、透明度、運(yùn)動(dòng)方向和生命周期等,這些屬性隨著時(shí)間的推移在不斷地變化。一個(gè)粒子究竟有什么樣的屬性主要取決于其實(shí)現(xiàn)的具體應(yīng)用。
 一般情況下,系統(tǒng)中的每個(gè)粒子都會(huì)隨著虛擬世界時(shí)間的流逝經(jīng)歷一個(gè)產(chǎn)生—活動(dòng)—消亡3個(gè)階段的流程[5],如圖1所示。

2 煙花粒子系統(tǒng)建模
2.1 建立坐標(biāo)系

 本文建立的坐標(biāo)系以屏幕的中心為坐標(biāo)原點(diǎn),從左到右的方向?yàn)閄軸的正方向,從下到上為Y軸的正方向,從屏幕里面指向外面的方向?yàn)閆軸正方向[6]。
2.2 煙花及粒子的數(shù)據(jù)結(jié)構(gòu)
 煙花粒子的數(shù)據(jù)結(jié)構(gòu)如下:
 typedef struct
 {
        GLfloat    x,y,z;    //粒子位置
        GLfloat    xSpeed,ySpeed,zSpeed;    //粒子的速度
        GLfloat    xg,yg,zg;//粒子的運(yùn)動(dòng)加速度
        GLfloat    r,g,b;    //粒子的顏色
}PARTICLES;//粒子
煙花則是由一組具有相似性質(zhì)的煙花粒子組成的,其數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct
{
      PARTICLES particle[MAX_PARTICLES][MAX_TAIL];
      GLfloat life,fade,rad;
}Fire;//煙花
2.3 煙花粒子系統(tǒng)的初始化
 煙花粒子系統(tǒng)的初始化就是賦予煙花粒子屬性初始狀態(tài)。在煙花系統(tǒng)中,每個(gè)煙花由一組具有相似性質(zhì)的煙花粒子組成,每一幀煙花的更新就是這組煙花粒子的更新。這里把每組粒子數(shù)定義為一個(gè)常數(shù)MAX_PARTICLES,這個(gè)常數(shù)的選擇很重要[7],如果過(guò)大,會(huì)影響系統(tǒng)的實(shí)時(shí)性;如果過(guò)小,則會(huì)影響煙花模擬的真實(shí)性。
 #define MAX_PARTICLES 96 //煙花小粒子個(gè)數(shù)
 #define MAX_TAIL 30 //煙花尾部的長(zhǎng)度
 通過(guò)隨機(jī)函數(shù)rand()和參數(shù)控制煙花的初始位置、初始顏色、速度、加速度、生命周期及衰減速率。其中, 顏色的初始化可以在模型中定義各種顏色到一個(gè)顏色數(shù)組中,然后通過(guò)隨機(jī)函數(shù)rand()調(diào)用。粒子的運(yùn)動(dòng)受到各種外力的影響,包括重力和空氣阻力等,在本實(shí)驗(yàn)中,只考慮垂直方向重力所產(chǎn)生的加速度。
 fire.life=1.0f;
 fire.rad=rand()%K1+P1;   //K1、P1為參數(shù)
 fire.fade=(float)(rand()%K2)/K3+P2;
   //K2、K3、P1為參數(shù)
2.4 煙花粒子的運(yùn)動(dòng)更新
 煙花粒子運(yùn)動(dòng)更新是整個(gè)煙花系統(tǒng)中最重要的組成部分,就是確定每一時(shí)刻當(dāng)前粒子的運(yùn)動(dòng)狀態(tài),包括該時(shí)刻粒子的位置、速度和生命值等各種屬性值。而這些屬性又是由上一幀屬性狀態(tài)和運(yùn)動(dòng)的規(guī)律決定的。粒子下一幀的位置為:


3 位置可控?zé)熁M
 OpenGL應(yīng)用工具包GLUT中封裝有鼠標(biāo)消息注冊(cè)回調(diào)函數(shù),利用此函數(shù)可以很好地控制煙花的位置,從而進(jìn)一步增強(qiáng)煙花模擬的可控性和靈活性。
 鼠標(biāo)的按下、松開(kāi)或移動(dòng)等操作都可以產(chǎn)生相應(yīng)的鼠標(biāo)消息,這些消息在應(yīng)用程序開(kāi)發(fā)中出現(xiàn),常常需要處理。GLUT對(duì)這幾種常用的鼠標(biāo)消息進(jìn)行了封裝,glutMontionFunc(void(*func)(int button,int state,int x,int y))可以實(shí)現(xiàn)對(duì)鼠標(biāo)左鍵、右鍵或中鍵的按下、松開(kāi)等操作的消息響應(yīng)。其中,button是左鍵、右鍵和中鍵的標(biāo)志,state是按下、松開(kāi)的標(biāo)志。
 用鼠標(biāo)單擊屏幕,系統(tǒng)把單擊的位置傳送給鼠標(biāo)消息注冊(cè)回調(diào)函數(shù)glutMontionFunc(mouseFunc),通過(guò)一系列的坐標(biāo)轉(zhuǎn)換生成最終需要的OpenGL坐標(biāo),然后煙花在此位置上發(fā)生爆炸。主要實(shí)現(xiàn)的代碼如下:
GLdouble w [3]={0};//最終的OpenGL坐標(biāo)
GLint viewport[4];
    GLdouble mv[16],proj[16];
GLfloat winX,winY,winZ;//視景體坐標(biāo)及深度坐標(biāo)
glPushMatrix();
glGetIntegerv(GL_VIEWPORT,viewport);    
//取得當(dāng)前視口的狀態(tài)值
glGetDoublev(GL_MODELVIEW_MATRIX,mv);
//取得當(dāng)前模型視點(diǎn)的最大值
glGetDoublev(GL_PROJECTION_MATRIX,proj);
//取得當(dāng)前投影的最大值
glPopMatrix();
winX=x;
winY=viewport[3]-y;
glReadPixels(winX,winY,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&winZ);
gluUnProject(winX,winY,winZ,mv,proj,viewport,w,w+1,w+2);//取得最終的OpenGL坐標(biāo)
4 音頻與煙花爆炸同步
 OpenGL本身不支持音頻,本文使用了Win32的API函數(shù)庫(kù)中的PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound)函數(shù)實(shí)現(xiàn)音頻與煙花爆炸的同步。引入windows.h頭文件(#include<windows.h>),后面加上如下代碼:
 #include<mmsystem.h>
 #pragma comment(lib,"WINMM.LIB")
 PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound)只能實(shí)現(xiàn)WAV格式的文件,其他音頻文件可以通過(guò)別的軟件進(jìn)行剪切并轉(zhuǎn)化為WAV格式。參數(shù)pszSound是指定了要播放聲音的字符串,本實(shí)驗(yàn)中設(shè)為WAVE文件的名字;參數(shù)fdwSound是標(biāo)志的組合,為實(shí)現(xiàn)同步和引入音頻文件,將其設(shè)為SND_FILENAME| SND_SYNC。主要實(shí)現(xiàn)的代碼如下:
 if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
 {
 獲取鼠標(biāo)點(diǎn)擊的位置
 繪制煙花的代碼
 PlaySound("煙花聲音.wav",NULL,SND_ASYNC|SND_FILENAME);
 }
5 實(shí)驗(yàn)結(jié)果評(píng)估與分析
 實(shí)驗(yàn)利用粒子系統(tǒng)對(duì)煙花生成的過(guò)程進(jìn)行仿真,應(yīng)用了OpenGL的紋理映射、色彩混合、顯示列表、加入背景圖片、插入音頻和控制位置等技術(shù),結(jié)果如圖3所示。圖3是運(yùn)用可以截取鼠標(biāo)位置的紅蜻蜓截圖工具截取的實(shí)驗(yàn)結(jié)果圖片,從圖中可以清晰地看見(jiàn)在鼠標(biāo)的位置上煙花發(fā)生了爆炸。

 運(yùn)用粒子系統(tǒng)對(duì)不規(guī)則模糊物體進(jìn)行模擬是一個(gè)有效的方法。本實(shí)驗(yàn)從系統(tǒng)的實(shí)時(shí)性、簡(jiǎn)單性、靈活性和逼真性角度出發(fā)實(shí)現(xiàn)了煙花模型模擬,采用了紋理映射和顯示列表技術(shù),提高了系統(tǒng)的實(shí)時(shí)性;采用了色彩融合技術(shù),增強(qiáng)了系統(tǒng)的逼真性;加入了背景圖,提高了模擬的真實(shí)感;通過(guò)提取鼠標(biāo)位置,實(shí)現(xiàn)了對(duì)煙花爆炸位置的控制,增強(qiáng)了系統(tǒng)的靈活性;加入了音頻技術(shù),實(shí)現(xiàn)煙花爆炸和聲音的同步,增強(qiáng)了系統(tǒng)的沉浸感。
參考文獻(xiàn)
[1] REEVES W T. Particle systems-a technique for modeling a class of fuzzy objects[J].  Computer Graphics,1983,17(3):359-376.    
[2] 王曉娟.基于粒子系統(tǒng)動(dòng)態(tài)煙花的模擬[J].青海大學(xué)學(xué)報(bào),2009(4):29-32.
[3] 肖何,何明耘,白忠建.OpenGL中基于粒子系統(tǒng)的噴泉模擬實(shí)現(xiàn)[J].計(jì)算機(jī)仿真,2007(12):201-204.
[4] SHREINER D.OpenGL編程指南[M].李軍,徐波,譯.北京:機(jī)械工業(yè)出版社,2010.
[5] 葛芳,張成,韋穗,等.基于粒子系統(tǒng)的煙花動(dòng)畫(huà)設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010,20(8):180-183.
[6] 汪繼文,胡文平,金余鋒.基于粒子系統(tǒng)的8字動(dòng)態(tài)煙花仿真[J].計(jì)算機(jī)仿真,2010,27(10):211-214.
[7] 丁紀(jì)云,陳利平,李思昆.基于OpenGL的煙花動(dòng)態(tài)模擬方法的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2002,20(4):233-250.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品日韩一区| 在线免费观看欧美| 免费看的黄色欧美网站| 性欧美video另类hd性玩具| 一区二区三区视频在线看| 亚洲精品网址在线观看| 亚洲国产高潮在线观看| 欧美一区二区视频在线观看| 亚洲免费在线精品一区| 亚洲一区三区视频在线观看| 亚洲深夜影院| 中国成人亚色综合网站| 99精品视频免费观看| 亚洲精品综合| 一本色道精品久久一区二区三区 | 欧美大秀在线观看| 蜜臀av性久久久久蜜臀aⅴ| 麻豆精品网站| 欧美巨乳波霸| 欧美色大人视频| 国产精品日产欧美久久久久| 欧美午夜精品久久久久久久| 国产精品日韩欧美一区| 国产区精品在线观看| 国产亚洲激情在线| 亚洲成在人线av| 亚洲第一区在线| 亚洲区一区二| 夜夜嗨av一区二区三区免费区| 国产精品99久久久久久人| 亚洲嫩草精品久久| 久久国产精品久久w女人spa| 最近看过的日韩成人| 99re6热只有精品免费观看| 亚洲一区二区三区成人在线视频精品 | 亚洲国产专区| 99精品国产在热久久下载| 亚洲天堂av在线免费观看| 亚洲欧美福利一区二区| 久久精品夜色噜噜亚洲a∨| 亚洲区中文字幕| 亚洲视频在线观看一区| 欧美亚洲三级| 欧美aⅴ一区二区三区视频| 欧美日韩视频免费播放| 国产老女人精品毛片久久| 激情文学综合丁香| 日韩视频永久免费观看| 亚洲欧美日韩国产一区二区| 亚洲国产成人精品视频| 制服丝袜亚洲播放| 欧美在线一二三四区| 欧美成人国产一区二区| 国产精品久久久久一区二区三区共| 国产一区二区三区免费观看| 亚洲精品久久久久久一区二区| 亚洲一区二区三区精品在线观看| 亚洲电影自拍| 亚洲欧美国产精品专区久久| 美女黄毛**国产精品啪啪| 国产精品国产成人国产三级| 尤物九九久久国产精品的特点 | 亚洲视频网站在线观看| 亚洲电影自拍| 午夜精品久久久久久久久久久久久| 久久亚洲精品一区二区| 国产精品久久久久久妇女6080| 在线看国产一区| 亚洲一区二区三区影院| 亚洲精品久久7777| 欧美一区二区三区四区视频| 欧美激情1区2区| 国产综合色在线| 在线一区二区三区做爰视频网站 | 欧美不卡高清| 国产精品一区二区三区乱码| 亚洲国产一区二区a毛片| 性做久久久久久久免费看| 一区二区三区www| 快射av在线播放一区| 国产精品亚洲综合色区韩国| 亚洲国产三级网| 欧美一区三区二区在线观看| 亚洲特色特黄| 欧美激情按摩在线| 国内外成人在线| 亚洲欧美日韩精品久久亚洲区| 日韩视频在线一区| 久久综合九九| 国产日韩视频| 亚洲欧美激情视频在线观看一区二区三区| 亚洲美女淫视频| 老牛嫩草一区二区三区日本| 国产日韩精品一区二区三区在线| 日韩一级精品| 夜夜嗨av一区二区三区| 免费看的黄色欧美网站| 韩日精品视频| 欧美在线视频a| 久久高清免费观看| 国产精品亚洲激情| 亚洲天堂免费观看| 亚洲午夜激情| 欧美日韩国产探花| 亚洲精品在线电影| 99re视频这里只有精品| 欧美黑人一区二区三区| 亚洲第一伊人| 亚洲精品一区二区三区婷婷月| 老司机一区二区| 韩日精品在线| 亚洲盗摄视频| 免费观看在线综合色| 娇妻被交换粗又大又硬视频欧美| 欧美一区二区私人影院日本| 欧美尤物一区| 国产午夜精品理论片a级探花 | 亚洲天堂男人| 翔田千里一区二区| 国产欧美一区二区视频| 亚洲综合色视频| 欧美一级久久久久久久大片| 国产精品一国产精品k频道56| 中文久久精品| 校园春色综合网| 国产毛片一区二区| 欧美一区二粉嫩精品国产一线天| 久久精品国产99国产精品澳门| 国产精品私拍pans大尺度在线| 亚洲综合欧美日韩| 久久久国产成人精品| 国产午夜精品美女毛片视频| 欧美一区二区三区视频| 久久一日本道色综合久久| 韩国一区二区三区在线观看| 亚洲高清色综合| 欧美精品一卡| 中文一区字幕| 欧美在线视频观看免费网站| 国产一区二区久久久| 久久精品视频导航| 欧美国产日韩视频| 99xxxx成人网| 欧美在线视频一区| 亚洲第一综合天堂另类专| 亚洲乱码国产乱码精品精可以看| 欧美日韩国产一区精品一区| 亚洲小说春色综合另类电影| 久久av最新网址| 尤物yw午夜国产精品视频| 9国产精品视频| 国产精品一区二区久久久| 欧美主播一区二区三区美女 久久精品人 | 国产日韩在线视频| 亚洲国产婷婷香蕉久久久久久| 欧美激情精品久久久六区热门| 一区二区三区视频免费在线观看| 欧美一区二视频在线免费观看| 精品69视频一区二区三区| 亚洲美女视频在线免费观看| 国产精品地址| 久久国产精品99久久久久久老狼| 欧美黄网免费在线观看| 亚洲一区欧美一区| 欧美a级片一区| 亚洲永久精品国产| 欧美成人免费观看| 亚洲一区二区久久| 免费不卡视频| 亚洲视频www| 欧美不卡视频一区| 亚洲一区二区三区四区五区黄| 免费不卡在线观看av| 亚洲一区二区三区777| 鲁大师影院一区二区三区| 日韩视频中文| 久久阴道视频| 亚洲婷婷综合久久一本伊一区| 久久综合福利| 中文国产一区| 欧美国产精品劲爆| 欧美亚洲午夜视频在线观看| 欧美日韩国产综合新一区| 欧美在线资源| 国产精品va在线播放我和闺蜜| 亚洲电影在线看| 国产区二精品视| 亚洲午夜精品国产| 在线高清一区| 久久本道综合色狠狠五月| 日韩亚洲在线| 欧美承认网站| 久久精品噜噜噜成人av农村| 国产精品福利影院| 亚洲美女av在线播放| 国内精品模特av私拍在线观看| 亚洲欧美国产另类| 99re成人精品视频| 欧美激情四色| 亚洲国产精品精华液网站|