粒子系统基本原理
给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。粒子属性的初始值通常由随机过程产生。粒子往往由位于空间某个位置的粒子源产生。
一个粒子系统是随时间不断变化的,在生命期的每一刻都要完成以下4步工作。
1粒子源产生新粒子:产生一定数目的新粒子,其初始属性由随机过程控制。每个粒子可以具有一个生命期,如果某些粒子不应删除,则可以赋予他们无限长的生命期。
2更新现存粒子的属性:例如粒子有位置和速度属性,就需要根据粒子原来的位置速度和流逝的时间计算粒子的新位置。
3删除已经死亡的粒子:检查所有粒子的生命期如果法线某粒子已经死亡则将该粒子从粒子系统中删除
4绘制粒子:将粒子系统中所有的粒子绘制出来,得到所需要的视觉效果
点精灵point spirits。
具有中心点位置和大小的粒子,并且在渲染时根据其中心位置和大小自动计算出多边形的4个顶点并自动旋转面向观察者方向。
粒子管理器(the Particle Manager)
粒子管理器是一个管理类,用于控制我们的各种粒子系统 .一个管理类将掌管创建,释放,更新和渲染所有的系统.这样,管理类必须有一个属性是指向粒子系统的指针.建立或是使用一个数组模版(array template),会使工作变得简单些.
粒子系统的使用者会希望较容易地增加系统.并且也不想跟踪所有的系统以保证所有粒子均已死亡从而可以从内存中释放它们.这就是设计管理类的目的.管理器将会在需要时自动更新和渲染系统,并删除已死亡的系统.
当使用不定时系统(系统将在给定的时间后死亡)时,有一个检查系统是否已被删除的函数是很有用的(例如,是否它还存在于粒子管理器中).想象你创建了一个系统并存储了指向系统的指针。通过这个指针每一帧访问系统. AddSystem 函数可能只有一个参数:指向粒子类的指针.这将允许你根据需要轻易地增加一个烟系统或火系统.下面是我如何在引擎中增加一个粒子系统的例子: gParticleMgr->AddSystem( new Smoke(nrSmokeParticles, position, ...) ); 在世界更新函数中我调用了gParticleMgr->Update()函数,这个函数自动更新所有的系统并释放死亡的系统.Render函数然后渲染所有的可见粒子系统.
因为我们不想在每一帧跟踪系统中的所有粒子以判断是否所有的粒子均已死亡(这样系统可被删除),我们将使用Update函数来代替.如果这个函数返回TRUE,这意味着系统处于存活状态;反之系统已死亡并可以被删除.
在我的粒子系统中,其中分配的所有具有相同底纹和混合方式的粒子将连续地渲染,同时将底纹转换和上载减到最小.这样,如果在屏幕上有十个可见的烟系统,就只有一个底纹转换和状态改变将被执行.