2

私は小さなゲームを実装していますが、物理演算を正しく機能させるのに問題があります。このゲームでは、1つのボール(フレームからフレームに移動し、半径が変わる可能性のある円)といくつかの壁(フレームからフレームに移動する線分)があります。衝突を正しく検出でき、ボールが正しい方向に跳ね返るのは問題ありません。

ボールが1つのフレームでラインと交差し、次のフレームで再び交差してダブルバウンスを引き起こす状況では、問題が発生します。有効な位置になるまでボールをラインの法線に沿って戻すことはできますが、問題のラインがその軸に沿って打たれると、これは本当に奇妙な動作を引き起こします(ピンポンボールが直立したつまようじに落ちると想像してください。つまようじの片側になるように突然脇に移動します...)。また、ボールが特定のフレームで複数の線と交差する場合にもいくつかの問題があります(4本の線が一緒になって長方形を作り、ボールがその長方形の角と交差することを想像してください)-どの方向に跳ね返る必要がありますか?どちらの方向にシフトする必要がありますか?

具体的な質問はありませんが、ヒントや役立つチュートリアルを探しています。私がこれまでに見つけたすべての2Dは、長方形の交差点のみをカバーしています。

違いがあればXNAを使用しています。

ありがとう、
キャメロン

4

2 に答える 2

2

これは、ほとんどの物理ライブラリに共通の問題です。「侵入深度」をグーグルで検索すると(「物理学」と一緒に、またはまったく異なるものを見つけるかもしれません:D)、これらのライブラリでさえあなたのようなトリックを使用していることがわかります。

これには 2 つの解決策があります。

安価な方法は、更新頻度を増やすことです。オブジェクトを 1 つの大きなステップではなく 10 の小さなステップで移動すると、貫通力が低下するため、壁からボールを​​オフセットして固定することは目立たなくなります。

高価なものは、継続的な衝突検出です。動いている物体と静止している物体が与えられた場合、両方が交差する正確な時点を教えてくれるアルゴリズムがあります。これらのいくつかを見つけるために、Googleの「スイープ球の長方形の交差点」。

次に、次のように更新できます: ボールは 1.0 単位移動する必要があります。衝突をチェックします。衝突は 0.25 単位後に発生するため、ボールを 0.25 単位移動し、反射ベクトルを計算し (ボールが壁から跳ね返るように)、残りの 0.75 単位で衝突チェックを繰り返します (ボールの最終的な位置がわかるまで)。これにより、貫通が完全に回避され、ボールが非常に速く動いている場合でも、通常は 1 回の更新で壁をスキップしてしまう場合でも、衝突が検出されます。

于 2009-12-10T07:39:08.467 に答える
1

タイムステップのために、衝突が更新間の許容可能なポイントを超えて交差することは、一般的に認められています。

基本的に、衝突が実際に発生した最後のフレームと現在のフレームの間のポイントに補間し、オブジェクトをそのポイントに戻し、力を計算する必要があります。

于 2009-12-08T21:53:24.050 に答える