Velocity (xVel, yVel, together) 是一个二维向量。鼠标和粒子之间的距离也是如此。向量包含方向和大小。所以你想要一个向量,它是鼠标位置和粒子位置之间的差异。
var posRelativeToMouse = {
x: particle.x - mousPosX,
y: particle.y - mousPosY
};
x 和 y 的数字太小意味着粒子离鼠标很近,而大的数字意味着它离鼠标很远。
接下来我们需要弄清楚这些数字应该如何影响粒子的速度。所以我们需要两件事。
我们将它们推向什么方向?
大多数情况下,我们已经有了这个。posRelativeToMouse
是一个具有我们想要的方向的向量。我们只是对其进行归一化,这意味着将向量的长度设置为 1。为此,我们将每个分量除以向量的当前长度。这个向量的长度总是distance
从粒子到鼠标的距离。
var distance = Math.sqrt(
posRelativeToMouse.x * posRelativeToMouse.x +
posRelativeToMouse.y * posRelativeToMouse.y
);
var forceDirection = {
x: posRelativeToMouse.x / distance,
y: posRelativeToMouse.y / distance,
};
我们推动粒子的力度有多大?
这是距离的倒数。近意味着大推,远意味着小推。所以让我们重用我们distance
上面计算的。
// distance past which the force is zero
var maxDistance = 1000;
// convert (0...maxDistance) range into a (1...0).
// Close is near 1, far is near 0
// for example:
// 250 => 0.75
// 100 => 0.9
// 10 => 0.99
var force = (maxDistance - distance) / maxDistance;
// if we went below zero, set it to zero.
if (force < 0) force = 0;
好的,我们有方向,我们有力量。剩下的就是将其应用于粒子速度。
particle.xVel += forceDirection.x * force * timeElapsedSinceLastFrame;
particle.yVel += forceDirection.y * force * timeElapsedSinceLastFrame;
假设您通过 xVel/yVel 为每一帧的位置设置动画,您现在应该有粒子被鼠标推开。