近几个星期以来一直在搞粒子系统,下面简要总结一下。
粒子系统从其本质来说就是一些点被发射出来,并在其生命周期内受到一些影响。
这些点的信息也无非就是位置,方向,颜色等等,根据需要也可以扩充其他。
而渲染的时候则根据粒子的信息,再结合具体的渲染类型(比如billboard)进行渲染。
从上面可以看出粒子系统分为4各部分
1. 粒子,这里只要把他理解成一些关心的变量集合,比如位置,方向,颜色,纹理偏移,生命时间等
2. 发射器,其实就是一个喷嘴,把粒子发射出来。所谓发射出来,听起来挺悬的,其实就是将粒子标记为活动,并对其数据进行初始设置。
3. 影响器,对发射出来的例子数据施加影响,根据物理模型,或者其他什么规则改变粒子的数据而已。
4. 渲染器,对发射出来的粒子进行渲染绘图。
除了这4各部分还需要有一个总的结构来对其进行总的管理,这就是ParticleSystem.ParticleSystem的主要工作就是负责管理上面提到的4各部分,做好粒子的分配和回收(使用队列,分别是活动粒子队列和空闲粒子队列),并在更新函数中调用发射器和影响器,统筹管理。
在具体设计的时候需要仔细考虑的一个问题也是一个关键的问题是粒子系统是否可以发射粒子系统,听起来有些奇怪,粒子系统怎么能发射粒子系统呢。其实说白了就是将粒子系统本身作为粒子并可以被其他粒子系统发射。这将是一个非常重要的特性,可以实现嵌套发射,实现更加丰富的效果。
同时还需要进一步考虑的问题是,既然粒子系统可以发射粒子系统,那么发射的粒子系统再发射的粒子到底受那个粒子系统的影响其影响呢?是发射粒子系统的那个粒子系统影响器影响,还是直接发射他的那个粒子系统影响其影响。(很像绕口令)
关于这个问题,我的设计就是,发射出来的粒子只受发射他的粒子系统中的影响其影响。换句话说爸爸之影响儿子,爷爷不能影响孙子。这样就使问题明确且单纯。反过来说如果允许爷爷影响孙子,那么太爷爷是否也要影响孙子,太太爷爷呢?这样问题就被无限复杂下去了。
据一个例子,爷爷粒子系统发射爸爸粒子系统,其出速度为零,并横向发射,爸爸粒子系统发射孙子粒子,起初速度为零冰箱上发射。那么最终看到的效果就是一个个例子水平排开,并作垂直向上的运动。
在Ogre中只实现了粒子系统发射发射器,这是不够彻底的!
关于渲染器,其实就是那到粒子的数据并根据具体的渲染器类型构造真正的几何数据并进行渲染。
接下来在讨论一下更加复杂的特效系统。
特效系统视项目不同包含很多东西,通常有粒子系统,相机,后期,音效等。很显然特效系统是一个各个效果的集合。在具体的实现过程中他们可能会同意包裹在一个特效类中,也可能分散开来,此时特效系统就是一个概念,而没有具体的对应实现。到底选用哪种方案呢?需要考虑以下几个问题:
1. 从引擎的实现角度考虑这些子系统本身并没有特别直接的关系(除了概念上都是特效的一部分以外)。每个部分都可以做的很独立很模块化。因此额外的再将其整合到一个所谓的特效系统中就有一些画蛇添足的意思。
2. 从工具的角度来看,有些引擎分别在不同的工具(至少是用一个工具的不同面板下)分别制作这些特效元素。比如Unreal等。而有些引擎则将其放在一个工具中进行制作,并最终保存为一个文件。
从上面两点来看,总的来说还是分别独立实现要好一些。从引擎内部模块的实现,从工具的制作流程都比较明确清楚。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Leo1981816/archive/2010/04/25/5527202.aspx