2

衝突テストに次のコードがあります。

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/ )

4

1 に答える 1

1

最初に 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/

于 2012-11-18T09:25:14.970 に答える