粒子系统
先简单了解一下粒子系统:
粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的游戏图形。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。
通常粒子系统在三维空间中的位置与运动是由发射器控制的。发射器主要由一组粒子行为参数以及在三维空间中的位置所表示。粒子行为参数可以包括粒子生成速度(即单位时间粒子生成的数目)、粒子初始速度向量(例如什么时候向什么方向运动)、粒子寿命(经过多长时间粒子湮灭)、粒子颜色、在粒子生命周期中的变化以及其它参数等等。使用大概值而不是绝对值的模糊参数占据全部或者绝大部分是很正常的,一些参数定义了中心值以及允许的变化。
典型的粒子系统更新循环可以划分为两个不同的阶段:参数更新/模拟阶段以及渲染阶段。每个循环执行每一帧动画。
描述
参考网站首页的光环效果:http://i-remember.fr/en 。
制作过程
首先新建一个粒子系统对象。
在粒子系统属性面板进行一些参数的设置。对于光环,粒子是在开始时一次性发射的,所以取消勾选Looping;为了不让粒子消失,将Start Speed设为0。
由于背景是黑色的,需要将相机对象的Clear Flags设置为Solid Color,并将Background设置为黑色。
为了用代码控制粒子的生成和运动,参照 http://www.manew.com/thread-47123-1-1.html(文章源代码:https://github.com/RafalWilinski/Particle-Sea )的方法。
for (int i = 0; i < amount; ++i) {
particleData [i] = new ParticleData (radius + std_dev * randomNormalDistribution (),Random.Range (0, 2 * Mathf.PI));
particle [i].position = new Vector3 (particleData [i].radius * Mathf.Sin (particleData [i].angle), 0f, particleData [i].radius * Mathf.Cos (particleData [i].angle));
particle [i].startSize = 0.05f + (i % 5) * 0.001f;
}
这里通过正态分布生成粒子运动半径,通过极坐标的方式确定位置。粒子的大小与序号有关。
在Update里让粒子旋转。
void Update () {
for (int i = 0; i < amount; ++i) {
float step = 0.0005f+0.0003f * (i % 5) + 0.0002f*particleData [i].radius;
particleData [i].angle += speed * step;
particleData [i].radius = Mathf.PingPong (particleData [i].initRadius, 1.2f * particleData [i].initRadius);
particle [i].position = new Vector3 (particleData [i].radius * Mathf.Sin (particleData [i].angle), 0f, particleData [i].radius * Mathf.Cos (particleData [i].angle));
}
particleSystem.SetParticles (particle, particle.Length);
}
这里为了使所有粒子整体运动看起来比较自然,粒子的运动速度与序号和半径有关,再用Mathf.Pingpong
使得粒子半径在一定范围内变化。
还可以复制出多个粒子系统对象,在面板调整不同的参数,使画面更丰富。