速度(xVel,yVel,一起)是2D矢量。鼠標和粒子之間的距離也是如此。 A vector包含方向和大小。所以你需要一個與鼠標位置和粒子位置不同的矢量。
var posRelativeToMouse = {
x: particle.x - mousPosX,
y: particle.y - mousPosY
};
所以少量的x和y意味着粒子接近老鼠,大意味着它很遠。
接下來,我們需要弄清楚這些數字應該是如何影響粒子的速度。所以我們需要2件事。
什麼方向我們推他們?
我們已經有這樣的居多。 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每一幀,你現在應該有通過鼠標被推開顆粒。
很好,但現在我有另一個問題。如何讓粒子「回到」之前的速度?因爲在離開鼠標後,他們開始用新的速度+ force – mjanisz1 2013-02-27 20:20:50
@ mjanisz1開始瘋狂,這取決於你希望他們如何表現。但是這聽起來有點像你想要對粒子產生阻力,這意味着它們隨着時間的推移會自行減速?一個簡單而粗略的方法是在每一幀上使速度變得更小一些。像'particle.xVel * = 0.99'(當然也是'yVel')。這意味着粒子每幀將失去1%的速度,如果沒有其他力量作用於其上,最終應該接近零。您可以將「0.99」值調整爲任何可以提供所需拖動量的值。 – 2013-02-27 21:56:53
非常感謝很多人沒有想到的乘法(簡單的事情是最好也是最難想象的)。如果'force == 0 && xVel> xVelOriginal'比第一個速度乘以0.99!希望它的作品:)謝謝你很多! – mjanisz1 2013-02-28 18:48:42