⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 构建高级粒子系统.htm

📁 3D图象编程中粒子系统相关的一些资料。包括通用粒子系统的原理
💻 HTM
📖 第 1 页 / 共 3 页
字号:

<HTML><HEAD><TITLE>构建高级粒子系统</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>&gt;&gt; </B><!-- #BeginEditable "%B1%EA%CC%E2" --><A class=YellowLink 
            href="http://mays.soage.com/develop/effect/200111/AParSystem.htm">构建高级粒子系统</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">创建数据结构</A><BR>  3 
            <A class=BlackLink 
            href="http://mays.soage.com/develop/effect/200111/AParSystem.htm#3.0">函数</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">小结</A><BR><BR>
            <HR align=center noShade SIZE=1 width="95%">
            <BR>  请大家想象游戏中的这样一个场景:一枚火箭拖着尾烟划过天际,突然火箭爆炸了,碎片四处飞溅。其中,一具生物的尸体向你飞来,它的碎片飞散开来,带起蓬蓬血雾,然后在镜头上留下混乱的血肉痕迹。这个场景中的所有这些元素的共同点是什么呢?<BR>  是的,多数元素都是混乱的。但从技术的角度讲,本场景中的大多数效果得益于一个优秀的粒子系统。烟,火花,血这些现代游戏中的效果通常使用粒子系统来创建。<BR>  为了实现这些效果,你需要构件一个粒子系统,而且不仅仅是一个简单的系统。你所需要的是一个高级粒子系统,一个快速,便捷,可扩展的系统。如果你是初次接触粒子系统,我推荐你先阅读Jeff 
            Lander的文章(<SPAN class=English>The Ocean Spray in Your Face, Graphic 
            Content, July 
            1998</SPAN>)。Lander的文章和本文的区别在于,前者描述了粒子系统的基本概念,而这里我着重于如何构建更高级的系统。我将会随本文提供完整的源代码,你可以下载以验证本系统。<BR><A 
            name=1.0></A><BR><B>1、性能和需要</B><BR>  高级粒子系统可能会需要大量的代码,所以设计好数据结构是非常重要的。此外必须牢记如果设计欠佳,粒子系统会大幅降低刷新率,并且大多数的性能问题是由粒子系统带来的内存管理问题引起的。<BR>  设计粒子系统时首先应该明白粒子系统大大增加每帧的可见多边形数量。每个粒子可能需要四个顶点和两个三角形。以此计算,一个场景中的2,000个可见的雪花粒子将增加4,000个可见的三角形。又因为大多数粒子是运动的,我们不能预先计算顶点缓冲,所以每一帧,定点缓冲都需要被改变。<BR>  技巧在于只执行尽量少的内存操作(分配和释放)。这样,如果一个粒子在一定时间后消亡,不要急着从内存中释放。相反,用一个标志来记录它是死亡还是重生(重新初始化)。然后当所有的粒子都被标为死亡时,释放整个粒子系统。(包括系统中的所有粒子),如果系统是定常的,那么使系统保持存活。如果你想要重建系统或只想假入一个新的粒子,你应该根据粒子所属的系统使用相应的默认设置/属性来自动初始化粒子。<BR>  例如,我们在构建一个“烟”系统。当你创建或重建一个粒子时,你可能按表1中的值来设定(当然,血和烟的初始颜色,能量,大小,速度是不同的)。注意各个值亦依赖于系统本身的设定。如果你为烟系统设定风以使烟飘向左方,那么新粒子的速度必然不同于不受风影响的垂直升起的烟系统。如果你有一个定常的烟系统,且烟粒子的能量是零(如此你就看不见它了),你会想重新初始化它的设定以使它满载能量地又从底部升起。有的粒子系统可能需要粒子以不同的方式被渲染。例如,你或许会想要几种血系统,例如喷血,溅血,血池和溅在镜头上的血痕,等等。每个效果包含特定的粒子。“喷血”将渲染血在空中喷射的景象,当这些血喷在墙壁上,会调用“溅血”系统,营造出血迹在墙和地板溅开的效果。血池系统创建出某人被击毙后地板上的几滩血迹。<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>数据类型</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%">粒子的先前位置,有时有用</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%">粒子颜色(顶点颜色)</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>  每个粒子系统都以一种独特的方式工作。溅血和烟雾的渲染方式是有很大区别的。烟雾粒子通常面对活动镜头,而溅血则映射到血溅到的平面上。<BR>  当构建粒子系统时,必须考虑到游戏中所有可能的可变参数,并把他们灵活地建入系统。让我们再次以烟雾系统为例。我们可能会想改变风的方向向量以使当汽车驶过烟雾时,烟粒子受到汽车带起的风的影响。从这点你会意识到每一个系统对于自己的作用而言都是很特殊的。但如果我们想要以某种方式控制系统中还不被系统规则支持的粒子时,该怎么办?为了达到这个目的,我们还需要创建一个“手工”粒子系统,以使我们能够每帧刷新所有的粒子属性。<BR>  最后我们要考虑的是在引擎层次中连接粒子系统的能力。或许我们想要为一支香烟连接一个烟雾系统或发光系统。如果角色移动,连接到香烟的粒子系统应该得到正确的刷新。这就是高级粒子系统的一些基本要求。在下一节,我将讲述如何设计一个性能优良的数据结构以实现上述的所有特性。<BR><A 
            name=2.0></A><BR><B>2、创建数据结构</B><BR>  现在我们知晓我们需要什么样的特性。图1显示了将要创建的系统的概貌。请注意在图中有一个粒子管理器(<SPAN 
            class=English>Particle Manager</SPAN>),稍候我将对此做出解释。<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>  在此我们采用从下到上的步骤来设计类,首先是粒子类(<SPAN 
            class=English>Particle 
            Class</SPAN>)。<BR>  粒子类。如果你曾经建过粒子系统,你会知道粒子必需的属性。表1列出了其中一些常见的属性。注意粒子的先前位置也可能有用。例如,你可能会想在一个粒子的先前和当前位置之间画它。火花就是一个从中受益的好例子。你可以在图2中看到我创造的火花效果。<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>  色彩和能量属性也能够用来创建一些有趣的特效。在前一个粒子系统中,我在烟系统中使用色彩,这样我能够在场景中动态地为粒子进行光照渲染。能量值也是非常重要的。能量是与粒子的生命周期相关的-你可以利用这一点来判断一个粒子是否消亡。而且由于某些粒子的色彩和强度随时间变化(例如火花),你或许会想把它与定点色彩的Alpha通道值联系起来。<BR>  我强烈推荐把粒子类的构造函数设为空,因为你并不想在构造的时候使用默认值,这是由于对大多数的例子系统来说,这些值总是不同的。<BR>  粒子系统类(<SPAN 
            class=English>The Particle System 
            Class</SPAN>)这个类是整个系统的核心。刷新粒子的属性和设置粒子的形状都在这个类中进行。我现有的粒子系统类使用我的3D引擎的节点类,其中包含例如位置向量、旋转四元数和比例值的数据。由于我继承了这个节点类的所有成员,我能够在引擎的层次结构中连接我的粒子系统,使得引擎能够改变粒子系统的位置,就如同上面讨论过的香烟系统一样。但如果你的引擎没有层次支持,或者如果你在构建一个独立的粒子系统,这就不需要了。表2列出了在粒子系统基类中你所需要的属性。<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>数据类型</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 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -