簡體   English   中英

在圈子碰撞中“粘在一起”

[英]“Sticking together” in circle collision

我的碰撞測試中有以下代碼:

if (Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2) <= Math.pow(A.radius + B.radius, 2)) {
    A.x_vel = (A.x_vel * (A.mass - B.mass) + (2 * B.mass * B.x_vel)) / (A.mass + B.mass);
    A.y_vel = (A.y_vel * (A.mass - B.mass) + (2 * B.mass * B.y_vel)) / (A.mass + B.mass);
    B.x_vel = (B.x_vel * (B.mass - A.mass) + (2 * A.mass * A.x_vel)) / (A.mass + B.mass);
    B.y_vel = (B.y_vel * (B.mass - A.mass) + (2 * A.mass * A.y_vel)) / (A.mass + B.mass);
    A.x = A.x + A.x_vel;
    A.y = A.y + A.y_vel;
    B.x = B.x + B.x_vel;
    B.y = B.y + B.y_vel;
}

結果是圓圈粘在一起。 我該如何解決? 演示位於http://jsfiddle.net/tLpEV/3/ (全屏: http : //fiddle.jshell.net/tLpEV/3/show/

您首先要更改A的速度,然后使用更改后的速度來計算B的新速度。您需要使用A的原始速度,因此將A的新速度存儲在臨時變量中,直到您計算出A的速度為止。 B:

var ax = (A.x_vel * (A.mass - B.mass) + (2 * B.mass * B.x_vel)) / (A.mass + B.mass);
var ay = (A.y_vel * (A.mass - B.mass) + (2 * B.mass * B.y_vel)) / (A.mass + B.mass);
B.x_vel = (B.x_vel * (B.mass - A.mass) + (2 * A.mass * A.x_vel)) / (A.mass + B.mass);
B.y_vel = (B.y_vel * (B.mass - A.mass) + (2 * A.mass * A.y_vel)) / (A.mass + B.mass);
A.x_vel = ax;
A.y_vel = ay;
A.x = A.x + A.x_vel;
A.y = A.y + A.y_vel;
B.x = B.x + B.x_vel;
B.y = B.y + B.y_vel;

演示: http//jsfiddle.net/Guffa/tLpEV/4/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM