【互动媒体创意编程1&2】万千星河都涌向你——向量、速度、力与加速度
这个代码把第一章和第二章融合到一起了。在这个程序里,我赋予了一群粒子三个不同的运动状态。
本来其实并没有把这两个试验写成一个的打算,只是写着写着突然发现他们需要被集合在一起。不仅它们需要在代码中被放到一起,而且我还需要在一起讲。
这个程序的效果是一开始我并没有能够预料到的。起初只是想要实现向量的计算,没想到在里面发现了一些力和噪声的成分。
首先放上效果图。
1.状态1:噪声实现的平凡随机游走
2.状态2:被吸引向鼠标位置加速运动。
3.状态3:粒子被吸向鼠标之后继续运动
4.状态4:粒子按照原有速度方向保持运动
1.随机游走
我们首先需要一个粒子系统作为运动的载体。
粒子系统在第四章讲,现在略过。
创建一个粒子系统:
balls = new ArrayList<Ball>();
for (int i = 0; i< 200; i++){
Ball b = new Ball();
balls.add(b);
}
接下来只要为每一个粒子添加速度,让它随机游走就可。
for (Ball b : balls){
b.walk();
}
Particle.walk()函数:
public void walk(){
time1 += 0.01; time2 += 0.01;
PVector offset = new PVector(sin(noise(time1) * 10),cos(noise(time2) * 10));
position.x += offset.x;
position.y += offset.y;
boundaryDetect();
ellipse(position.x, position.y, mass, mass);
}
其中有定义
time1 = random(0, 10);time2 = random(0,10000);
time1和time2将作为构成规定随机游走的偏移量的noise()函数的参数、把time2设置地远大于time1是为了使offsetx和offsety尽量少有相关性,否则粒子将会有向固定方向偏移的趋势。
2.粒子群向鼠标位置加速追赶
我们需要表示这样的一个运动的趋势,即距离鼠标中心最远的粒子所受到的中心的吸引力越小。而这个吸引力我们希望它只作用一次,来为粒子施