1

私はこれを再現しようとしていますが、かなり成功しています。ただし、衝突処理に問題があります。衝突処理は機能しているように見えますが、非常に奇妙な動作をしています。これが私がこれまでに持っているものです。これは衝突を処理するコードです:

var dx = particle2.getX() - particle1.getX();
var dy = particle2.getY() - particle1.getY();
var angle = Math.atan2(dy, dx);

var newP2X = particle1.getX() + (particle1.getRadius() + particle2.getRadius()) * Math.cos(angle);
var newP2Y = particle1.getY() + (particle1.getRadius() + particle2.getRadius()) * Math.sin(angle);

particle2.setX(newP2X);
particle2.setY(newP2Y);     

var p1Vxi = particle1.getVx();
var p1Vyi = particle1.getVy();
var p1Mass = particle1.getMass();

var p2Vxi = particle2.getVx();
var p2Vyi = particle2.getVy();
var p2Mass = particle2.getMass();

var vxf = (p1Mass * p1Vxi + p2Mass * p2Vxi) / (p1Mass + p2Mass);
var vyf = (p1Mass * p1Vyi + p2Mass * p2Vyi) / (p1Mass + p2Mass);

particle1.setVx(vxf);
particle1.setVy(vyf);
particle2.setVx(vxf);
particle2.setVy(vyf);

編集:提案されているように非弾性衝突に変更しようとしましたが、何らかの理由でボールが不規則に衝突します。ここでチェックしてください

どんな助けでも大歓迎です!

4

1 に答える 1

2

まず、直感的に、凍った池にお手玉を投げる場面を想像してください。衝突し、まったくバウンドせず (垂直方向の速度が失われます)、同じ横方向の速度で滑ります。それが私たちが目指している種類の衝突です。

今物理学。参照フレームの移動。北行きの列車が納屋を通過します。納屋の農夫の参照フレームでは、納屋は静止しており、列車は 10 m/s で北 (0°) に移動しています。列車の乗客の参照フレームでは、列車は静止しており、納屋は 10 m/s で南 (180 度) に移動しています。自転車は東 (90 度) を 5 m/s の速さで走っています (農夫の基準座標系)。自転車乗りのフレームでは、自転車は静止しており、納屋は 5 m/s で西 (270°) に移動しており、列車は 11.18 m/s で移動しており、方位は 333.4° です。異なるフレーム間で簡単に変換できます。

2つのことが衝突しています。関心のあるフレームは、全運動量がゼロのフレームです。これは重心フレームと呼ばれます。2 つの質量が m 1と m 2で、速度がv 1v 2の場合、重心 (自転車の自転車のように、重心座標系で静止している点) の速度は、フレーム) は (m 1 v 1 + m 2 v 2 )/(m 1 + m 2 ) です。このフレーム内の 2 つのオブジェクトの速度を計算して続行します。

オブジェクトが衝突します。接触面を描きます。この場合、接触の瞬間に両方の円に接する線です。これは瞬間的な構造であり、すべての参照フレーム (回転を含まない) で同じです。重心座標系では、各オブジェクトは、この境界が固定された固体表面であるかのように動作します。この場合、跳ね返ることのない氷のシートです。そのため、速度ベクトルを 2 つの成分に分割します。1 つは氷の表面に平行で、もう 1 つは氷の表面に垂直 (垂直) です。最初のものを保持し、2 番目のものを破棄します。

次に納屋のフレームに戻して完成です。

于 2012-10-14T15:44:53.860 に答える