プールゲームでボールの方向と速度を計算するアルゴリズムを探しています。プールゲームは、私が覚えている最も古いコンピューターゲームの一部であるため、これには何らかのタイプのオープンソースコードが必要だと確信しています。
つまり、あるボールが別のボールに当たった場合、両方のボールの方向を計算するアルゴリズムが必要です。それは、彼らがお互いに衝突する正確な角度と速度に依存します。
Javaコーディングを練習したいので、このタイプのコードを持つJavaコードまたはパッケージを探しています。
プールゲームでボールの方向と速度を計算するアルゴリズムを探しています。プールゲームは、私が覚えている最も古いコンピューターゲームの一部であるため、これには何らかのタイプのオープンソースコードが必要だと確信しています。
つまり、あるボールが別のボールに当たった場合、両方のボールの方向を計算するアルゴリズムが必要です。それは、彼らがお互いに衝突する正確な角度と速度に依存します。
Javaコーディングを練習したいので、このタイプのコードを持つJavaコードまたはパッケージを探しています。
回答:
基本的な球体と球体の衝突検出/応答は非常に簡単ですが、適切なプールシミュレーションに十分に正確に実行することは、スピンに対処する必要があるため、より注意が必要です。
物理エンジンの存在を知っていますか?いくつかの人気のある例はこれらです(そして、それらは単なるプールボールの衝突以上のことができます)。おそらく、プールゲームを作成するのに適していますが、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
「独自のロール」ルートを選択した場合、「プールホールのレッスン:円または球の間の高速で正確な衝突検出」の記事に興味があるかもしれません。Java固有ではありませんが、単純なシミュレーションに関係するアルゴリズムの一部について説明しています。
スピンがモデル化されていない単純なプールゲームの場合、アルゴリズムは非常に単純です。
擬似コードでは、これは次のようになります。
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
}
}
すべてのボールの質量が同じで、プールゲームのすべてのボールの半径が一定である場合、アルゴリズムから質量を省略できますが、コードはこれらの単純化なしでより便利です。
コードはこのチュートリアルに基づいていますが、インパルス乗算がそこで間違っていたことを覚えています。