2

ビリヤードのほとんどの衝突検出アルゴリズムは単純なアプローチを使用しており、ボールの位置がインクリメントされてから衝突がチェックされます。衝突を「スキップ」する可能性があるため、速度が非常に高い場合、この方法はうまく機能しません。

ビリヤード ゲームでボールの軌道を事前に計算する方法を探しています。軌跡がわかったら、動きが止まるまでボールをアニメートします。衝突は数学的に検出され、解決されるため、速度について心配する必要はありません。

誰かがそれをしたかどうか知っていますか?車輪の再発明はしたくありません。ありがとうございました。

4

4 に答える 4

1

四分木から始めて、サンプリング間隔を小さくします。ただし、ビリヤード ボールが速すぎて他のボールをすり抜けてしまう場合は、ゲームのモデリングが正しくありません。ボールが実際に速く動くビリヤードのゲームをプレイしたことがありますか?

あるいは

タイム ステップ間で、ボールの以前の位置と現在の位置を 2 次元の円柱としてモデル化します。2 つの円柱が衝突した場合は、タイム ステップを小さくして再試行します。このようにして、非常に高速な一般計算を取得し、超高速を処理できます。

于 2009-12-14T23:18:10.017 に答える
1

私が同様の目的で実装した解決策の 1 つは、可変時間ステップを使用することです。

実装は次のようになります。ボールの位置を決定するための時間パラメータ化されたメソッドがあります (現在の時間 T と変数の時間 V)。デフォルトでは、V に 1.0 を指定します。更新された位置の計算では、衝突検出を実行できます。衝突検出の自然なアーティファクトは、衝突が発生したときの部分的な指標です。これが発生した場合は、現在の反復の位置をリセットし、分数 V ですべての移動を再送信してから、量 1.0 - V を反復します。

これは驚くほどうまく機能し、比較的単純な実装であるという利点があります。懸念事項の 1 つは、"自然な" タイム スライス (つまり、1 つの表示フレームなど) 中に何度も動きを計算できるようにするには、十分な CPU パワーが必要なことです。ただし、このタイプの計算は最新のプロセッサでは非常に簡単であるため、問題にはなりません。

于 2009-12-14T23:23:09.220 に答える
1

簡単な方法は、非常に細かいステップ サイズで「素朴な」アプローチを使用することですが、実際にはまだボールをアニメートしません。

于 2009-12-14T23:14:44.260 に答える
1

私は何年も前に同様のことを行い、時間の関数としての位置でボールの動きを説明しました。この方法を使用して、任意の 2 つのボールが交差する正確な時間を見つけることができました。各ボールは、キューの先頭に最小の交差時間を持つ優先キューを保持し、衝突が発生したときにキューが調整されます。これは非常にうまく機能し、ボールに加速がなかった最初のパスは非常に簡単でした。後で (より難しい数学を使用して) 摩擦を追加して動作するように拡張することもできました。

この方法の主な欠点は、フレームごとに少しの作業を行う代わりに、計算がすべて一度に行われ、その後しばらく何も行われない傾向があることです。これは、フレームレートが安定しないことを意味します。私が 8 年ほど前に実行していたハードウェアでは、目立った問題は発生しませんでした。休憩中、または複数のボールが壁にぶつかったときに正確に接触して同じ方向に移動するなど、多かれ少なかれ不可能な奇妙なケースでも、フレームレートは低下しますが、目立ったものはありません.

于 2010-05-10T15:37:41.043 に答える