博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

粒子系统

Posted on 2011-06-29 11:14  +石头+  阅读(636)  评论(0)    收藏  举报

在3D游戏中我们经常可以看到一些很玄的特效,其中很多都是用粒子系统做的,粒子系统由大量的粒子组成。每一组粒子具有一组属性、大小及纹理,可能还需要颜色、透明度、运动速度、方向、生命周期等属性, 一个粒子究竟有什么样的属性,主要取决于具体的应用,粒子属性的初始值通常随机产生。整个粒子系统是随时间不断更新变化的。 常见的有爆炸效果,火焰效果,烟雾效果,天气效果,魔法技能效果,环境特效 。

设计一个粒子系统,核心内容有3部分:

1)粒子数据管理

粒子系统中存在着相当数目的粒子。这些粒子会随着时间的变化从产生到消亡。如何合理的创建和释放这些资源,在复杂的粒子系统中一个重要的技术就是内存池技术。

2)粒子更新

粒子系统的更新函数会循环遍历粒子并对每个粒子的属性进行处理。

3)粒子的渲染

遍历整个系统中所有的可见粒子,并把这些粒子绘制到屏幕上。

粒子系统常用有两种技术,一种是点精灵技术,一种是公告板技术。后者的使用概率较大。游戏中粒子特效特别的多,几乎每个画面都会有很多粒子特效共同组成,我们不能每个特效都单独的去写,所以我们采用可配置的方式实现例子特效。一个粒子系统最重要的部分就是粒子的生命周期,发射器,效果器。我们把配置文件写成XML形式,通过各个参数的控制来实现想要的效果,这样就不用每个特效都单独的写了,每个特效只需要一个相应的配置文件就ok了。配置文件例子如下:

<ParticleSystem>

    <渲染器类型>0</渲染器类型>

    <与场景混合方式>4</与场景混合方式>

    <默认高度>0.800000</默认高度>

    <默认宽度>0.800000</默认宽度>

    <纹理名>HotParticle.tga</纹理名>

    <最大粒子数>560</最大粒子数>

    <粒子系统坐标系>0</粒子系统坐标系>

    <是否是2D粒子系统>0</是否是2D粒子系统>

    <粒子朝向 x="0.000000" y="0.000000" z="1.000000" />

    <粒子UP向量 x="0.000000" y="1.000000" z="0.000000" />

    <面向摄像机的方式>1</面向摄像机的方式>

    <纹理动画循环时间>1.000000</纹理动画循环时间>

    <发射器 类型="盒子发射器">

        <盒子大小 盒子宽度=0.3 盒子高度=0.3 盒子深度=0.3 />

        <角度>0.0</角度>

        <起始颜色 r="1.000000" g="1.000000" b="1.000000" a="1.000000" />

        <结束颜色 r="1.000000" g="1.000000" b="1.000000" a="1.000000" />

        <方向 x="0.000000" y="0.400000" z="0.000000" />

        <发射率>123.000000</发射率>

        <最小生存期>0.600000</最小生存期>

        <最大生存期>0.700000</最大生存期>

        <最小速度>0.000000</最小速度>

        <最大速度>0.000000</最大速度>

        <位置 x="5.000000" y="0.000000" z="0.000000" />

        <旋转轴 x="0.000000" y="1.000000" z="0.000000"    />

        <旋转速度>4.8</旋转速度>

        <偏移速度 x="0.000000" y="7.000000" z="0.000000"    />

        <偏移时间> 3.0 </偏移时间>

        

        <持续发射最小时间>20.000000</持续发射最小时间>

        <持续发射最大时间>30.00000</持续发射最大时间>

        <间歇最小时间>0.010000</间歇最小时间>

        <间歇最大时间>0.600000</间歇最大时间>

    </发射器>

    <效果器 类型="颜色衰减图">

        <衰减图>ColorBlend_Hot.tga</衰减图>

    </效果器>

    <效果器 类型="旋转">

        <旋转范围起始角度>0.892085</旋转范围起始角度>

        <旋转范围结束角度>3.892085</旋转范围结束角度>

        <旋转速度起始值>0.054395</旋转速度起始值>

        <旋转速度结束值>0.506146</旋转速度结束值>

        <旋转加速度>0.01000</旋转加速度>

    </效果器>

    <效果器 类型="线性外力">

        <外力 x="0.000000" y="0.000000" z="0.000000" />

        <受力模式>1</受力模式>

    </效果器>

</ParticleSystem>