プールゲームのアルゴリズムはありますか?


14

プールゲームでボールの方向と速度を計算するアルゴリズムを探しています。プールゲームは、私が覚えている最も古いコンピューターゲームの一部であるため、これには何らかのタイプのオープンソースコードが必要だと確信しています。

つまり、あるボールが別のボールに当たった場合、両方のボールの方向を計算するアルゴリズムが必要です。それは、彼らがお互いに衝突する正確な角度と速度に依存します。

Javaコーディングを練習したいので、このタイプのコードを持つJavaコードまたはパッケージを探しています。


2
ただし、自分で解決したい場合は、ベクターの知識が必要になるでしょう。幸運なことに、先日、このサイトの他の場所で、線形数学に関する素晴らしいチュートリアルを誰かが投稿しました。
-doppelgreener

たぶん、このサイトはあなたを助けることができますarchive.ncsa.illinois.edu/Classes/MATH198/townsend/…–

回答:


8

基本的な球体と球体の衝突検出/応答は非常に簡単ですが、適切なプールシミュレーションに十分に正確に実行することは、スピンに対処する必要があるため、より注意が必要です。

物理エンジンの存在を知っていますか?いくつかの人気のある例はこれらです(そして、それらは単なるプールボールの衝突以上のことができます)。おそらく、プールゲームを作成するのに適していますが、Javaの学習にはあまり適していません...

2Dで

Box2D:http ://www.box2d.org

シマリス:http : //code.google.com/p/chipmunk-physics/

3Dで

箇条書き:http : //bulletphysics.org/

ODE:http : //www.ode.org

大きな予算の商用ゲームを作成している場合:

Havok:http : //www.havok.com


1
これらのうち、Java物理エンジンはどれですか?
リケット

Box2D、Chipmunk、Bullet、およびODEのJavaポート、または少なくともバインディングがあります
1


2

スピンがモデル化されていない単純なプールゲームの場合、アルゴリズムは非常に単純です。

  1. 衝突が発生したかどうかを確認するには、ボール間の距離が半径の合計よりも小さいかどうかを確認します。
  2. 影響の法線を計算する
  3. 速度差、法線、衝撃係数、質量に基づいて衝撃力を計算します
  4. 両方のボールに衝撃力を加えます

擬似コードでは、これは次のようになります。

vector difference = ball2.position - ball1.position
float distance = sqrt(difference)
if (distance < ball1.radius + ball2.radius) {
    vector normal = difference / distance
    //vector velocityDelta = ball2.velocity - ball1.velocity
    vector velocityDelta = ball1.velocity - ball2.velocity

    float dot = dotProduct(velocityDelta, normal)

    if (dot > 0) {
        float coefficient = 0.5
        float impulseStrength = (1 + coefficient) * dot * (1 / ball1.mass + 1 / ball2.mass)
        vector impulse = impulseStrength * normal
        ball1.velocity -= impulse / ball1.mass
        ball2.velocity += impulse / ball2.mass
    }
}

すべてのボールの質量が同じで、プールゲームのすべてのボールの半径が一定である場合、アルゴリズムから質量を省略できますが、コードはこれらの単純化なしでより便利です。

コードはこのチュートリアルに基づいていますが、インパルス乗算がそこで間違っていたことを覚えています。


ドットがゼロより小さい場合はどうですか?私はこの擬似コードを調査してきました(そしてあなたがリンクしたものも、もう1つは負の数の2乗をとろうとしています-おそらくそれがあなたが特定した問題です)。確かに、入力位置と速度のすべてのセットで結果を生成したいですか?

@Poldieドットが負の場合、ボールはすでに互いに離れています。その場合、衝突を処理する必要はありません。
msell 14

コードのバージョンをideone.com/DhsAoWにノックアップしました。110,90と100,100の位置、0,2と0、-3の速度で-0.707を取得しています。これは多かれ少なかれ正面衝突です。(最初の半径ベースの衝突検出チェックが既に行われていると仮定します)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.