在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>
浙公网安备 33010602011771号