3

2D空間で移動する円の法線を計算する方法に頭を悩ませています。オブジェクトの速度(方向速度)の法線を計算することを想定しているところまで到達しましたが、それは私の大学の代数の心が過熱する場所です。中心点、半径、速度、および位置。

最終的には、Vector2.Reflectメソッドを使用して、この演習からもう少し現実的な物理を取得したいと考えています。

よろしくお願いします。

編集:提案を試してみるコードを追加しました(役に立たない)、おそらく提案を誤解しています。ここでは、バスケットボールと野球、つまりベースとバスケットを使用しています。また、位置と、動きを作成するために位置に追加されている速度があります。

if ((Vector2.Distance(baseMid, basketMid)) < baseRadius + basketRadius)
{
    Vector2 baseNorm = basketMid - baseMid;
    baseNorm.Normalize();
    Vector2 basketNorm = baseMid - basketMid;
    basketNorm.Normalize();
    baseVelocity = Vector2.Reflect(baseVelocity, baseNorm);
    basketVelocity = Vector2.Reflect(basketVelocity, basketNorm);
}

basePos.Y += baseVelocity.Y;
basePos.X += baseVelocity.X;
basketPos.Y += basketVelocity.Y;
basketPos.X += basketVelocity.X;
basketMid = new Vector2((basketballTex.Width / 2 + basketPos.X), (basketballTex.Height / 2 + basketPos.Y));
baseMid = new Vector2((baseballTex.Width / 2 + basePos.X), (baseballTex.Height / 2 + basePos.Y));
4

3 に答える 3

5

最初に反射。私があなたのコードを正しく読んでいるなら、Vector2.Reflectの2番目の引数はサーフェスの法線です。水平な床の法線は(0,1)で、速度(4、-3)のボールがそれに当たって速度(4,3)で飛び去ります。そうですか?そうでない場合は、ifステートメントの本文を変更する必要があります。(basketNorm = -baseNormを設定することで、いくつかのサイクルを節約できることに注意してください。)

今、物理学。書かれているように、2つのボールが衝突すると、それぞれが両方の球に接するガラスの壁に当たったかのように跳ね返りますが、これは現実的ではありません。プールで遊んでいるところを想像してみてください。速い赤いボールが静止している青いボールのデッドセンターに当たります。赤いボールは跳ね返り、青いボールを元の場所に残しますか?いいえ、青いボールはノックアウトされ、赤いボールはほとんどの速度を失います(完璧な場合はすべて)。同じ速度で反対方向に移動し、正面衝突する砲弾とゴルフボールはどうでしょうか。両方とも等しく跳ね返りますか?いいえ、砲弾は衝撃にほとんど気付かずに続行しますが、ゴルフボールは方向を逆にして、来たよりも速く飛び去ります。

これらの衝突を理解するには、運動量を理解する必要があります(また、ビーズバッグが衝突するときのように、完全に弾力性のない衝突が必要な場合は、エネルギーも理解する必要があります)。基本的な物理学の教科書は、初期の章でこれをカバーします。これらをシミュレートできるようにしたいだけの場合は、重心フレームを使用します。

Vector2 CMVelocity =(basket.Mass * casino.Velocity + base.Mass * base.Velocity)/(basket.Mass + base.Mass);

baseVelocity-= CMVelocity;
baseVelocity = Vector2.Reflect(baseVelocity、baseNorm);
baseVelocity + = CMVelocity;

BasketVelocity-= CMVelocity;
BasketVelocity = Vector2.Reflect(basketVelocity、basketNorm);
BasketVelocity + = CMVelocity;
于 2010-02-09T19:19:16.647 に答える
1

エッジ上の特定のポイントでの円の法線は、その中心からそのポイントへの方向になります。ここで円の衝突を処理していると仮定すると、これを解決する簡単な「簡単な」方法の1つは、衝突時(円が接触しているとき)に次のようになります。

Aを一方の円の中心とし、Bをもう一方の円の中心とします。円Aの法線はnormalize(BA)になり、円Bの法線はnormalize(AB)になります。これは、それらが接触する点が常に2つの円の中心と同一直線上にあるためです。

于 2010-02-06T05:11:24.560 に答える
0

警告:これが完全に正しいとは思いません。物理学は私の専門ではありません。

動きは正常に影響を与えません。通常、法線は、方向、通常は3Dオブジェクト上でポリが向いている方向を示す正規化された(長さ1)ベクトルです。

あなたがやりたいと思うのは、2つの円の間の衝突が正常であることを見つけることです。もしそうなら、球のクールな特性の1つは、球の中心間の距離を見つけたら、それを正規化して球の法線を取得できることです。

2次元物理学で正しいと思われるのは、球の速度*質量(エネルギー)を取得し、それを他の球への正規化されたベクトルで乗算することです。結果を目的の球のエネルギーに加算し、元の球のエネルギーから減算し、それぞれを個別に質量で割って、結果の速度を取得します。他の球が動いている場合は、同じことを逆に行います。もちろん、そこから数学を単純化することもできますが、遅く、やりたくないです:)

両方の球が動いている場合は、もう一方の球に対してこのプロセスを繰り返します(ただし、より効率的な計算を行うために、その方程式を単純化することもできます)。

これは単なるナプキンの数学ですが、正しい結果が得られるようです。そして、ねえ、私はかつて自分でオイラー角を導き出したので、時々私のナプキンの数学が実際にうまくいくことがあります。

これはまた、完全に弾性衝突を想定しています。

私が間違っている場合は、どこにあるかを見つけて喜んでいます:)

于 2010-02-15T03:56:45.810 に答える