3D游戏编程与设计 作业八
粒子系统是模拟一些不确定、流动现象的技术。它采用许多形状简单且赋予生命的微小粒子作为基本元素来表示物体(一般由点或很小的多边形通过纹理贴图表示),表达物体的总体形态和特征的动态变化。人们经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。
创建粒子光环
参考 http://i-remember.fr/en ,使用粒子流编程控制制作一些效果, 如“粒子光环”
效果图:
创建粒子系统
新建一个空对象并命名为ParticleCycle,修改Particle System组件的属性如下:
创建 ParticleCycle脚本,在其中设置Particle System的基础状态:
public ParticleSystem particleSystem;
private ParticleSystem.Particle[] particlesArray;
public int seaResolution = 50;
void Start()
{
int number = seaResolution * seaResolution;
particlesArray = new ParticleSystem.Particle[number];
GetParticles();
var main = particleSystem.main;
main.maxParticles = seaResolution * seaResolution;
particleSystem.Emit(seaResolution * seaResolution);
particleSystem.GetParticles(particlesArray);
}
为粒子添加极坐标位置属性
private float[] motion;
private float[] radiuses;
粒子的其他属性:
void GetParticles()
{
for (int i = 0; i < seaResolution; i++)
{
for (int j = 0; j < seaResolution; j++)
{
float radius = Random.Range(minRadius, maxRadius);
float zPos = Mathf.PerlinNoise(i * noiseScale, j * noiseScale) * heightScale;
float athta = Random.Range(0.0f, 360.0f) / 180f * Mathf.PI;
int k = i * seaResolution + j;
athtas[k] = motion;
radiuses[k] = radius;
particlesArray[k].color = colorGradient.Evaluate(zPos);
particlesArray[k].position = new Vector3(radius * Mathf.Cos(motion),radius * Mathf.Sin(motion),zPos);
}
}
}
实现粒子的循环扩散动作:
void Update()
{
for (int i = 0; i < seaResolution; i++)
{
for (int j = 0; j < seaResolution; j++)
{
int k = i * seaResolution + j;
float zPos = Mathf.PerlinNoise(i * noiseScale + perlinNoiseAnimX, j * noiseScale + perlinNoiseAnimY) * heightScale;
motion[k] += 0.1f * Mathf.PI * Time.deltaTime;
motion[k] = athtas[k] > 2 * Mathf.PI ? athtas[k] - 2 * Mathf.PI : motion[k];
particlesArray[k].position = new Vector3(radiuses[k] * Mathf.Cos(motion[k]),radiuses[k] * Mathf.Sin(motion[k]),zPos);
}
}
perlinNoiseAnimX += 0.01f;
perlinNoiseAnimY += 0.01f;
particleSystem.SetParticles(particlesArray, particlesArray.Length);
}
声明Gradient类,用来设置粒子的颜色
public Gradient colorGradient;
particlesArray[k].color = colorGradient.Evaluate(zPos);