0

私はボールと長方形を持っています。ボールは移動できますが、長方形は固定されています (質量 = 無限)。

ボールには、位置、速度、半径、質量があります。

長方形には、位置、幅、高さがあります。

衝突時に衝突を検出して正しい応答を計算する関数は既にありますが、正しい応答を計算する前に交差を解決するのに問題があります。イメージでは:

http://i.stack.imgur.com/Xq5Vk.png

私はJavaを使用しています。

編集:このアルゴリズムを使用して解決:

  1. 長方形の境界とボールの間の最も近い点 (私は P と呼びます) を計算します (Clamp 関数で簡単に実行できます)。
  2. ボールの中心点 (C と呼びます) と P を結ぶベクトル (n と呼びます) を計算します (ベクトルの成分は (Px - Cx, Py - Cy) です)
  3. 交点の「長さ」を計算します (私はこれをオフセットと呼びます) (ball.radius - n.length)
  4. n を正規化し、オフセットを掛けます。
  5. ボール位置ベクトルから n を引きます。

Java コードで:

    private void resolveIntersectionWith(Ball ball){
        double closestX = clamp(ball.position.x, left(), right());
        double closestY = clamp(ball.position.y, top(), bottom());

        Vector n = new Vector(closestX - ball.position.x, closestY - ball.position.y);
        double offset = ball.radius - n.length;
        n.normalize().multiply(offset);
        ball.position.subtract(n);
    }
4

2 に答える 2

0

問題はおそらく、衝突を検出する方法によって引き起こされます。ボールが長方形の境界上または境界内にあるかどうかを確認していると仮定しています。この状況では、長方形内になるように位置を既に更新しています。ただし、速度をその位置に追加した後に衝突が発生するかどうかを確認する場合 ( x += v * dt)、衝突の正確な時間を決定できます。これは、ボールが新しい反復の残りの時間移動することを意味します。方向。

于 2013-04-20T12:19:09.747 に答える
0

これらの交差を避けるには、ボールが当たらなくなるまで、ボールをレクタングルから遠ざけるように移動する必要があります。

これを行う簡単な方法は、球の中心 P に最も近い四角形の点 Q を計算することです。次に、この点から球を次のように移動します。

P=P+(P-Q)*(r/abs(P-Q)-1) 

ここで、r は半径です。交差を避けるために、より小さなタイムステップでステップすることができる代替手段

編集:ミスクリック

于 2013-04-19T14:05:06.330 に答える