?? 構(gòu)建高級(jí)粒子系統(tǒng).htm
字號(hào):
<HTML><HEAD><TITLE>構(gòu)建高級(jí)粒子系統(tǒng)</TITLE></HEAD>
<BODY>
<TABLE align=center bgColor=#000000 border=0 cellPadding=0 cellSpacing=0
height=1 width="99%">
<TBODY>
<TR>
<TD width="100%"></TD></TR></TBODY></TABLE><!-- #EndEditable -->
<TABLE align=center bgColor=#000000 border=0 cellPadding=2 cellSpacing=0
width="99%">
<TBODY>
<TR class=BGGray>
<TD width="100%"> <!-- #BeginEditable "%B6%A8%CE%BB" -->
<!-- #EndEditable --></TD></TR></TBODY></TABLE><BR>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width="99%">
<TBODY>
<TR>
<TD class=BGRed width="1%"></TD>
<TD class=BGRed vAlign=top width="17%"><!-- #BeginEditable "%B5%BC%BA%BD" -->
<!-- #EndEditable --></TD>
<TD class=BGGray width="1%"></TD>
<TD width="1%"></TD>
<TD bgColor=#ff9933 width=0%></TD>
<TD colSpan=3 vAlign=top width="84%">
<TABLE border=0 cellPadding=2 cellSpacing=1 width="100%">
<TBODY>
<TR>
<TD class=BGRed width="100%"><B>>> </B><!-- #BeginEditable "%B1%EA%CC%E2" --><A class=YellowLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm">構(gòu)建高級(jí)粒子系統(tǒng)</A> 2001-11-22
<A class=BlackLink href="http://www.extremeworkteam.com/"
target=_blank>極限工作組</A> <A class=BlackLink
href="mailto:rick_yin@mail.china.com">Rick Cart </A><!-- #EndEditable -->
<TABLE align=center bgColor=#ff9933 border=0 cellPadding=0
cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="100%"><IMG height=1
width=1></TD></TR></TBODY></TABLE></TD></TR>
<TR vAlign=top>
<TD class=BGGrayMain width="100%"><!-- #BeginEditable "%C4%DA%C8%DD" --><BR> <B>目
錄</B><BR> 1 <A class=BlackLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#1.0">性能和需要</A><BR> 2
<A class=BlackLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#2.0">創(chuàng)建數(shù)據(jù)結(jié)構(gòu)</A><BR> 3
<A class=BlackLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#3.0">函數(shù)</A><BR> 4
<A class=BlackLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#4.0">粒子管理器</A><BR> 5
<A class=BlackLink
href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#5.0">小結(jié)</A><BR><BR>
<HR align=center noShade SIZE=1 width="95%">
<BR> 請(qǐng)大家想象游戲中的這樣一個(gè)場(chǎng)景:一枚火箭拖著尾煙劃過(guò)天際,突然火箭爆炸了,碎片四處飛濺。其中,一具生物的尸體向你飛來(lái),它的碎片飛散開(kāi)來(lái),帶起蓬蓬血霧,然后在鏡頭上留下混亂的血肉痕跡。這個(gè)場(chǎng)景中的所有這些元素的共同點(diǎn)是什么呢?<BR> 是的,多數(shù)元素都是混亂的。但從技術(shù)的角度講,本場(chǎng)景中的大多數(shù)效果得益于一個(gè)優(yōu)秀的粒子系統(tǒng)。煙,火花,血這些現(xiàn)代游戲中的效果通常使用粒子系統(tǒng)來(lái)創(chuàng)建。<BR> 為了實(shí)現(xiàn)這些效果,你需要構(gòu)件一個(gè)粒子系統(tǒng),而且不僅僅是一個(gè)簡(jiǎn)單的系統(tǒng)。你所需要的是一個(gè)高級(jí)粒子系統(tǒng),一個(gè)快速,便捷,可擴(kuò)展的系統(tǒng)。如果你是初次接觸粒子系統(tǒng),我推薦你先閱讀Jeff
Lander的文章(<SPAN class=English>The Ocean Spray in Your Face, Graphic
Content, July
1998</SPAN>)。Lander的文章和本文的區(qū)別在于,前者描述了粒子系統(tǒng)的基本概念,而這里我著重于如何構(gòu)建更高級(jí)的系統(tǒng)。我將會(huì)隨本文提供完整的源代碼,你可以下載以驗(yàn)證本系統(tǒng)。<BR><A
name=1.0></A><BR><B>1、性能和需要</B><BR> 高級(jí)粒子系統(tǒng)可能會(huì)需要大量的代碼,所以設(shè)計(jì)好數(shù)據(jù)結(jié)構(gòu)是非常重要的。此外必須牢記如果設(shè)計(jì)欠佳,粒子系統(tǒng)會(huì)大幅降低刷新率,并且大多數(shù)的性能問(wèn)題是由粒子系統(tǒng)帶來(lái)的內(nèi)存管理問(wèn)題引起的。<BR> 設(shè)計(jì)粒子系統(tǒng)時(shí)首先應(yīng)該明白粒子系統(tǒng)大大增加每幀的可見(jiàn)多邊形數(shù)量。每個(gè)粒子可能需要四個(gè)頂點(diǎn)和兩個(gè)三角形。以此計(jì)算,一個(gè)場(chǎng)景中的2,000個(gè)可見(jiàn)的雪花粒子將增加4,000個(gè)可見(jiàn)的三角形。又因?yàn)榇蠖鄶?shù)粒子是運(yùn)動(dòng)的,我們不能預(yù)先計(jì)算頂點(diǎn)緩沖,所以每一幀,定點(diǎn)緩沖都需要被改變。<BR> 技巧在于只執(zhí)行盡量少的內(nèi)存操作(分配和釋放)。這樣,如果一個(gè)粒子在一定時(shí)間后消亡,不要急著從內(nèi)存中釋放。相反,用一個(gè)標(biāo)志來(lái)記錄它是死亡還是重生(重新初始化)。然后當(dāng)所有的粒子都被標(biāo)為死亡時(shí),釋放整個(gè)粒子系統(tǒng)。(包括系統(tǒng)中的所有粒子),如果系統(tǒng)是定常的,那么使系統(tǒng)保持存活。如果你想要重建系統(tǒng)或只想假入一個(gè)新的粒子,你應(yīng)該根據(jù)粒子所屬的系統(tǒng)使用相應(yīng)的默認(rèn)設(shè)置/屬性來(lái)自動(dòng)初始化粒子。<BR> 例如,我們?cè)跇?gòu)建一個(gè)“煙”系統(tǒng)。當(dāng)你創(chuàng)建或重建一個(gè)粒子時(shí),你可能按表1中的值來(lái)設(shè)定(當(dāng)然,血和煙的初始顏色,能量,大小,速度是不同的)。注意各個(gè)值亦依賴于系統(tǒng)本身的設(shè)定。如果你為煙系統(tǒng)設(shè)定風(fēng)以使煙飄向左方,那么新粒子的速度必然不同于不受風(fēng)影響的垂直升起的煙系統(tǒng)。如果你有一個(gè)定常的煙系統(tǒng),且煙粒子的能量是零(如此你就看不見(jiàn)它了),你會(huì)想重新初始化它的設(shè)定以使它滿載能量地又從底部升起。有的粒子系統(tǒng)可能需要粒子以不同的方式被渲染。例如,你或許會(huì)想要幾種血系統(tǒng),例如噴血,濺血,血池和濺在鏡頭上的血痕,等等。每個(gè)效果包含特定的粒子。“噴血”將渲染血在空中噴射的景象,當(dāng)這些血噴在墻壁上,會(huì)調(diào)用“濺血”系統(tǒng),營(yíng)造出血跡在墻和地板濺開(kāi)的效果。血池系統(tǒng)創(chuàng)建出某人被擊斃后地板上的幾灘血跡。<BR><BR>
<TABLE align=center bgColor=#000000 border=0 cellPadding=2
cellSpacing=1 width="70%">
<TBODY>
<TR class=BGRed>
<TD width="18%"><B><FONT color=#cccccc>數(shù)據(jù)類型</FONT></B></TD>
<TD width="26%"><B><FONT color=#cccccc>名稱</FONT></B></TD>
<TD width="56%"><B><FONT color=#cccccc>描述</FONT></B></TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">Vector3</TD>
<TD class=ColorCode vAlign=top width="26%">position</TD>
<TD vAlign=top width="56%">空間中的粒子位置</TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">Vector3</TD>
<TD class=ColorCode vAlign=top width="26%">oldPos</TD>
<TD vAlign=top width="56%">粒子的先前位置,有時(shí)有用</TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">Vector3</TD>
<TD class=ColorCode vAlign=top width="26%">velocity</TD>
<TD vAlign=top width="56%">粒子速度(position += velocity)</TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">dword</TD>
<TD class=ColorCode vAlign=top width="26%">color</TD>
<TD vAlign=top width="56%">粒子顏色(頂點(diǎn)顏色)</TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">int</TD>
<TD class=ColorCode vAlign=top width="26%">energy</TD>
<TD vAlign=top width="56%">粒子的能量</TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">float</TD>
<TD class=ColorCode vAlign=top width="26%">size</TD>
<TD vAlign=top width="56%">粒子的大小</TD></TR>
<TR bgColor=#ffffff>
<TD class=BGRed colSpan=3 vAlign=top>
<DIV align=center><B><FONT color=#cccccc>表1
粒子屬性</FONT></B></DIV></TD></TR></TBODY></TABLE><BR> 每個(gè)粒子系統(tǒng)都以一種獨(dú)特的方式工作。濺血和煙霧的渲染方式是有很大區(qū)別的。煙霧粒子通常面對(duì)活動(dòng)鏡頭,而濺血?jiǎng)t映射到血濺到的平面上。<BR> 當(dāng)構(gòu)建粒子系統(tǒng)時(shí),必須考慮到游戲中所有可能的可變參數(shù),并把他們靈活地建入系統(tǒng)。讓我們?cè)俅我詿熿F系統(tǒng)為例。我們可能會(huì)想改變風(fēng)的方向向量以使當(dāng)汽車駛過(guò)煙霧時(shí),煙粒子受到汽車帶起的風(fēng)的影響。從這點(diǎn)你會(huì)意識(shí)到每一個(gè)系統(tǒng)對(duì)于自己的作用而言都是很特殊的。但如果我們想要以某種方式控制系統(tǒng)中還不被系統(tǒng)規(guī)則支持的粒子時(shí),該怎么辦?為了達(dá)到這個(gè)目的,我們還需要?jiǎng)?chuàng)建一個(gè)“手工”粒子系統(tǒng),以使我們能夠每幀刷新所有的粒子屬性。<BR> 最后我們要考慮的是在引擎層次中連接粒子系統(tǒng)的能力。或許我們想要為一支香煙連接一個(gè)煙霧系統(tǒng)或發(fā)光系統(tǒng)。如果角色移動(dòng),連接到香煙的粒子系統(tǒng)應(yīng)該得到正確的刷新。這就是高級(jí)粒子系統(tǒng)的一些基本要求。在下一節(jié),我將講述如何設(shè)計(jì)一個(gè)性能優(yōu)良的數(shù)據(jù)結(jié)構(gòu)以實(shí)現(xiàn)上述的所有特性。<BR><A
name=2.0></A><BR><B>2、創(chuàng)建數(shù)據(jù)結(jié)構(gòu)</B><BR> 現(xiàn)在我們知曉我們需要什么樣的特性。圖1顯示了將要?jiǎng)?chuàng)建的系統(tǒng)的概貌。請(qǐng)注意在圖中有一個(gè)粒子管理器(<SPAN
class=English>Particle Manager</SPAN>),稍候我將對(duì)此做出解釋。<BR><BR>
<TABLE align=center border=0 cellPadding=2 cellSpacing=0
class=BGRed>
<TBODY>
<TR align=middle>
<TD><IMG height=212 src="AParSystem-1.gif"
width=354></TD></TR>
<TR align=middle>
<TD><FONT color=#cccccc><B>圖1
粒子管理器</B></FONT></TD></TR></TBODY></TABLE><BR> 在此我們采用從下到上的步驟來(lái)設(shè)計(jì)類,首先是粒子類(<SPAN
class=English>Particle
Class</SPAN>)。<BR> 粒子類。如果你曾經(jīng)建過(guò)粒子系統(tǒng),你會(huì)知道粒子必需的屬性。表1列出了其中一些常見(jiàn)的屬性。注意粒子的先前位置也可能有用。例如,你可能會(huì)想在一個(gè)粒子的先前和當(dāng)前位置之間畫(huà)它。火花就是一個(gè)從中受益的好例子。你可以在圖2中看到我創(chuàng)造的火花效果。<BR><BR>
<TABLE align=center border=0 cellPadding=2 cellSpacing=0
class=BGRed>
<TBODY>
<TR align=middle>
<TD><IMG height=160 src="AParSystem-2.jpg"
width=387></TD></TR>
<TR align=middle>
<TD><FONT color=#cccccc><B>圖2
火花效果</B></FONT></TD></TR></TBODY></TABLE><BR> 色彩和能量屬性也能夠用來(lái)創(chuàng)建一些有趣的特效。在前一個(gè)粒子系統(tǒng)中,我在煙系統(tǒng)中使用色彩,這樣我能夠在場(chǎng)景中動(dòng)態(tài)地為粒子進(jìn)行光照渲染。能量值也是非常重要的。能量是與粒子的生命周期相關(guān)的-你可以利用這一點(diǎn)來(lái)判斷一個(gè)粒子是否消亡。而且由于某些粒子的色彩和強(qiáng)度隨時(shí)間變化(例如火花),你或許會(huì)想把它與定點(diǎn)色彩的Alpha通道值聯(lián)系起來(lái)。<BR> 我強(qiáng)烈推薦把粒子類的構(gòu)造函數(shù)設(shè)為空,因?yàn)槟悴⒉幌朐跇?gòu)造的時(shí)候使用默認(rèn)值,這是由于對(duì)大多數(shù)的例子系統(tǒng)來(lái)說(shuō),這些值總是不同的。<BR> 粒子系統(tǒng)類(<SPAN
class=English>The Particle System
Class</SPAN>)這個(gè)類是整個(gè)系統(tǒng)的核心。刷新粒子的屬性和設(shè)置粒子的形狀都在這個(gè)類中進(jìn)行。我現(xiàn)有的粒子系統(tǒng)類使用我的3D引擎的節(jié)點(diǎn)類,其中包含例如位置向量、旋轉(zhuǎn)四元數(shù)和比例值的數(shù)據(jù)。由于我繼承了這個(gè)節(jié)點(diǎn)類的所有成員,我能夠在引擎的層次結(jié)構(gòu)中連接我的粒子系統(tǒng),使得引擎能夠改變粒子系統(tǒng)的位置,就如同上面討論過(guò)的香煙系統(tǒng)一樣。但如果你的引擎沒(méi)有層次支持,或者如果你在構(gòu)建一個(gè)獨(dú)立的粒子系統(tǒng),這就不需要了。表2列出了在粒子系統(tǒng)基類中你所需要的屬性。<BR><BR>
<TABLE align=center bgColor=#000000 border=0 cellPadding=2
cellSpacing=1 width="95%">
<TBODY>
<TR class=BGRed>
<TD width="18%"><B><FONT color=#cccccc>數(shù)據(jù)類型</FONT></B></TD>
<TD width="19%"><B><FONT color=#cccccc>名稱</FONT></B></TD>
<TD width="63%"><B><FONT color=#cccccc>描述</FONT></B></TD></TR>
<TR bgColor=#ffffff>
<TD class=ColorCode vAlign=top width="18%">Texture</TD>
<TD class=ColorCode vAlign=top width="19%">*texture</TD>
<TD class=EtoC vAlign=top width="63%">A pointer to a texture,
which all particles will use. For performance reasons, we only
use one texture for each individual particle system; all
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -