书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录
1.10 加速度的交互
一、算法3
在算法3中,物体有朝着鼠标方向的加速度,我们将根据这一规则动态计算物体的加速度。
我们想要根据某个规则或公式计算一个向量,都必须同时算出两部分数据:大小和方向。
1、方向
先从方向开始,加速度的方向是物体朝向鼠标的方向,
假设物体的位置是(x,y),鼠标的位置是(mouseX,mouseY)。
如图1-15所示,物体的位置向量减去鼠标的位置向量,得到向量(dx,dy)。
我们用PVector实现上面的逻辑。假设这是在Mover类中,可以访问对象的位置:
PVector mouse = new PVector(mouseX,mouseY);
PVector dir = PVector.sub(mouse,location);
使用静态sub()函数,得到由某个点指向另一点的向量
2、快慢
现在,我们得到一个由Mover指向鼠标的PVector对象。如果直接把这个向量对象作为加速度,物体会瞬间移动到鼠标所在的位置,且动画效果很不明显,所以,接下来要做的就是确定物体移向鼠标的快慢。
为了设置加速度向量的大小(无论大小是多少),我们必须先单位化方向向量。只要能将方向向量缩短到1,我们就得到了一个只代表方向的单位向量,可以将它的大小设成任意值。1与任何数相乘,都等于那个数本身。
float anything = ?????
dir.normalize();
dir.mult(anything);
3、总结
我们对上面说到的几个步骤做个总结:
- 1.计算由物体指向目标位置(鼠标)的向量;
- 2.单位化该向量(将向量的大小缩短为1);
- 3.改变以上单位向量的长度(乘以某个合适的值);
- 4.将步骤3中得到的向量赋给加速度。
我们在update()函数中实现这些步骤:
二、示例代码1-10
示例代码1-10 朝着鼠标位置加速
Mover mover;
void setup() {
size(640,360);
mover = new Mover();
}
void draw() {
// background(255);
// Update the position
mover.update();
// Display the Mover
mover.display();
}
//mover.pde
class Mover {
// The Mover tracks position, velocity, and acceleration
PVector position;
PVector velocity;
PVector acceleration;
// The Mover's maximum speed
float topspeed;
Mover() {
// Start in the center
position = new PVector(width/2,height/2);
velocity = new PVector(0,0);
topspeed = 5;
}
void update() {
// Compute a vector that points from position to mouse
PVector mouse = new PVector(mouseX,mouseY);
PVector acceleration = PVector.sub(mouse,position);
// Set magnitude of acceleration
acceleration.setMag(0.2);
// Velocity changes according to acceleration
velocity.add(acceleration);
// Limit the velocity by topspeed
velocity.limit(topspeed);
// position changes by velocity
position.add(velocity);
}
void display() {
stroke(0);
strokeWeight(2);
fill(127);
ellipse(position.x,position.y,48,48);
}
}