速度(xVel、yVel、一緒に)は2Dベクトルです。また、マウスとパーティクルの間の距離も同様です。ベクトルには、方向と大きさの両方が含まれます。したがって、マウスの位置とパーティクルの位置の差であるベクトルが必要です。
var posRelativeToMouse = {
x: particle.x - mousPosX,
y: particle.y - mousPosY
};
したがって、xとyの数が少ない場合は、パーティクルがマウスに近いことを意味し、大きい場合は、パーティクルがマウスに近いことを意味します。
次に、これらの数値が粒子の速度にどのように影響するかを理解する必要があります。したがって、2つのものが必要です。
それらをどの方向に押し込みますか?
ほとんどの場合、これはすでにあります。posRelativeToMouse
は、必要な方向を持つベクトルです。正規化するだけです。つまり、ベクトルの長さを1に設定します。これを行うには、各コンポーネントをベクトルの現在の長さで除算します。このベクトルの長さは、常にdistance
パーティクルからマウスまでのtoです。
var distance = Math.sqrt(
posRelativeToMouse.x * posRelativeToMouse.x +
posRelativeToMouse.y * posRelativeToMouse.y
);
var forceDirection = {
x: posRelativeToMouse.x / distance,
y: posRelativeToMouse.y / distance,
};
粒子をどれだけ強く押しますか?
これは距離の逆数です。Closeは大きなプッシュを意味し、farは小さなプッシュを意味します。それでは、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によって各フレームの位置をアニメートしていると仮定すると、マウスによってパーティクルが押しのけられるはずです。