开始以为粒子系统与使用Fog一样都有现成的函数,只要改变一下状态,设置一下就可以达到想要的效果,在看过NEHE的粒子系统和网络上的一些介绍后才知道,粒子系统是先定义数据结构,设置纹理,写相关的处理函数一步一步实现的。
粒子系统主要用来解决由大量按一定规则运动的微小物质组成的大物质在计算机上的实现一定效果的显示。
每个粒子需要一些属性来和其他粒子区别,很多时候在一个系统中的所有粒子都有一个相同的属性集。
有一些适用于粒子的典型属性:
- 位置(Position):粒子在哪里。
处理运动粒子的每个粒子系统都需要知道每个粒子的位置。
- 速度(Velocity):包括速率(speed)和方向(direction)
位置的改变依赖于速度。速度是一个矢量表明系统由多快和粒子的运动方向。每一时间间隔,速度用于改变粒子位置。
- 加速度(Acceleration)
和速度作用于位置一样,加速度作用于速度。粒子的加速度通常适用于外力作用。外力经常是重力,或者是粒子间的引力或斥力。
- 生命值(Life):
每个粒子都有着自己的生命值,随着时间的推移,粒子的生命值不断减小,直到粒子死亡(生命值为0)。一个生命周期结束时,另一个生命周期随即开始,有时为了使粒子能够源源不断地涌出,必须使一部分粒子在初始后立即死亡。
- 衰减(Decay):
同人一样,会衰老的,每个粒子也有它自己的生命周期,Decay就是用来控制粒子生命周期的一个物理量。
需要与说明
高级粒子系统可能会需要大量的代码,所以设计好数据结构是非常重要的。此外必须牢记如果设计欠佳,粒子系统会大幅降低刷新率,并且大多数的性能问题是由粒子系统带来的内存管理问题引起的。
设计粒子系统时首先应该明白粒子系统大大增加每帧的可见多边形数量。每个粒子可能需要四个顶点和两个三角形。以此计算,一个场景中的2,000个可见的雪花粒子将增加4,000个可见的三角形。又因为大多数粒子是运动的,我们不能预先计算顶点缓冲,所以每一帧,定点缓冲都需要被改变。
技巧在于只执行尽量少的内存操作(分配和释放)。这样,如果一个粒子在一定时间后消亡,不要急着从内存中释放。相反,用一个标志来记录它是死亡还是重生(重新初始化)。然后当所有的粒子都被标为死亡时,释放整个粒子系统。(包括系统中的所有粒子),如果系统是定常的,那么使系统保持存活。如果你想要重建系统或只想导入一个新的粒子,你应该根据粒子所属的系统使用相应的默认设置/属性来自动初始化粒子。
粒子系统的基本思想:
Particle System可以说是一种基于物理模型来解决问题的方法,Imagic认为它的核心不是在于如何显示,而是在于对微小物质模型的规则提取。比如在水波算法中,能够总结出X0'=(X1+X2+X3+X4)/2-X0这个公式,才是整个算法的精华所在;只有基于物理模型的方法,才能模拟出随机而逼真的自然景象,这一点非常的关键,因为我们做Particle System是想让它看起来更加逼真,这也是仿真理论的基础。