作业要求
本次作业基本要求是三选一。
- 简单粒子制作
- 完善官方的“汽车尾气”模拟
- 使用粒子流编程控制制作一些效果, 如“粒子光环”
在本次作业中,我完成的是作业三——粒子光环。
实现
在项目中新建一个Particle System,修改一下Rotate以便其正对摄像机,Particle System中的相关参数也没有怎么修改:
然后就是通过脚本实现例子移动形成光环的效果了。
实现思路如下:
首先要使用一个数组particleRing来存储所有粒子,然后使用angle数组来存储各个粒子当前的角度(位置)和旋转半径R
private ParticleSystem.Particle[] particleRing;
private float[] particleAngle;
private float[] particleR;
实现旋转的部分如下:
if (i % 2 == 0){
particleAngle[i] += (i % level + 1) * speed;
}
else{
particleAngle[i] -= (i % level + 1) * speed;
}
particleAngle[i] = particleAngle[i] % 360;
float rad = particleAngle[i] / 180 * Mathf.PI;
particleRing[i].position = new Vector3(particleR[i] * Mathf.Cos(rad), particleR[i] * Mathf.Sin(rad), 0f);
这里的i是遍历整个粒子数组的index,前面的一个if判断的效果是让一半粒子顺时针旋转、一半粒子逆时针旋转。
每个粒子的Angle加上或者减去(i % level + 1)*speed,这里的用意是各个粒子的运行速度不完全一致,而是分为level个等级依次递增,然后将计算后的结果%360,为了保证Angle在合法范围[0,360]之间。
接着计算出相应弧度值,因为Mathf中的Cos和Sin函数接收的参数是弧度值。
最后就直接修改每一个粒子的位置,利用数学知识:
x
=
r
c
o
s
θ
x=rcos\theta
x=rcosθ、
y
=
r
s
i
n
θ
y=rsin\theta
y=rsinθ即可。
除此之外,本项目还实现了粒子光环的颜色渐变,利用到的是
public Gradient Color;
在每次update 遍历粒子的时候进行如下操作:
particleRing[i].color = Color.Evaluate(Mathf.Abs(Mathf.Cos(Time.time)));
可以根据时间来在渐变色板上以cos的变化进行取色。
此时效果如下:
基本实现了粒子光环的效果,但是想要进行一些处理,让光环的中间比较厚、两边比较薄一点,显得更加美观,因此在设置粒子半径r的时候增加如下操作:
先取最小半径和最大半径的均值,然后先在进行三次随机,这样粒子落在中间的概率就比落在两边的概率大了。
此时效果如下:
可以看出两边的厚度明显小于中间,粒子光环制作完成。