2つの衝突する物体の侵入を解決する方法


9

シンプルな3Dゲーム物理エンジンを実装しました。私はすでに適切な衝突検出を行っていますが、今は衝突応答の部分を理解しようとしています。衝突後の速度を計算するために、インパルスベースの方法を使用しています。これはかなりうまく機能しますが、ボディが相互貫通し続けるのを完全に防ぐわけではありません。そのため、ペネトレーションを解決するための追加のコードがあります。現在、私はボディを接触法線に沿って浸透深さの半分だけ移動します-最初のボディは接触法線の方向に、2番目のボディは反対方向に移動します。

これはほとんどの場合問題ありませんが、いくつかの望ましくない影響があります。たとえば、狭い廊下とその中を移動するオブジェクトを想像してみてください。オブジェクトが廊下の壁の1つにぶつかると、透過解像度によって反対側の壁に移動し、次のフレームで最初の壁に戻ります。効果は、オブジェクトが壁の間で本当に速く振動しているようなものであり、きれいではありません。

だから私の質問は、侵入を解決するより良い方法があるかどうかです?おそらくボディを動かさずに、(インパルス計算に加えて)どういうわけか速度を調整して、ボディが互いに近づくのを止め、ペネトレーションが次の数フレームで解決するようにします。私はここで推測しています。何か案は?

回答:


3

衝突を検出したら、ボディが最初に衝突し始めた時刻/ポイントを特定し、このポイントで衝突を処理します。この時点でまだ解決すべきわずかな侵入があるかもしれませんが、それははるかに小さくなり、[通常]発生している発振の問題を引き起こしません。

100msのシミュレーションステップがあり、いくつかのフレームで、フレームの途中(50ms)で衝突する2つのボールがあるとします。最初に、フレーム内の任意の時点でそれらが衝突したことを検出します(私はあなたがすでに効果的に行っていると信じています)。彼らはあなたが彼らが衝突したフレームの間のどの時点で決定するでしょう。次に、衝突しなかったフレームの最初の50msを含めて、衝突を処理します。これで、ボールの新しい速度が得られます。また、ボールが貫通しないことを確認するための手順を実行することもできます(「発生した」ため、これらは非常に小さいはずです)。最後に、次の50秒間をシミュレーションします。フレーム。この期間中、これらのボールの一方または両方との別の衝突が発生する可能性が非常に高いことに注意してください。


1
したがって、基本的には、継続的な衝突検出を実装し、ペネトレーションをまだ同じ方法で処理することをお勧めします。非常に小さいためです。これでうまくいくと思います。今、私は衝突検出を継続させる方法を理解する必要があります:)
adam

継続とはどういう意味かわかりません。厳密に言えば、すべてが常にいくつかのサイズの離散ステップに分解されるため、物理シミュレーションには連続的なものはありません。本質的に私が提案しているより小さなステップを踏むと、はるかに小さな(そして修正が容易な)エラーが生成されます。これについて考えるもう1つの方法は、ステップサイズとエラー(ペネトレーションなど)の間に直接的な関係があるということです。そのため、このようなエラーを検出した場合は、エラーが簡単に修正できるまで、小さなステップに分割してください。
notlesh

継続的な衝突検出とは、2つの静的オブジェクト間の交差(3d問題)をチェックする代わりに、2つの移動オブジェクト(基本的には4d問題)の接触をチェックすることを意味します。軌道を区分的線形曲線で近似できるため、通常は一定速度のみを考慮すれば十分です。利点は、侵入距離が常にゼロになることです(または浮動小数点の丸め誤差のために近い)。私はあなたがこれについて話していたけれども、多分私はあなたの答えを誤解しましたか?
アダム

@adamはい、それは私が話していることです。
notlesh 2012年

2

この記事をチェックしてください-以前にここに何度も投稿されていますが、衝突検出のタグ付きQ&Aを検索するだけです-ステフェルトンが話していた「連続的な」衝突解決を行う方法を示しています。

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

基本的に、2つの境界ボックスが交差し始めた正確な時点のいくつかの基本的な運動学方程式を解きます。その正確な瞬間に衝突を解決し、フレームの残り時間を続行します。オブジェクトの速度/加速度が変化するため、衝突の瞬間の後に何が起こるかを再シミュレーションする必要があるかもしれません。しかし、とにかくあなたの出発点があります...乾杯!


ありがとう、記事をチェックしました。物事は私のオブジェクトの異なる表現を使用しています。私は凸多面体を使用しており、分離軸定理を使用して衝突をテストしています。これは、一定の線形速度で移動するボディを処理するように拡張できます(方法は知っています)が、角速度も処理する方法がわかりません。しかし、私がこの方法を選択する場合は、別の質問をします。
アダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.