有台球游戏的算法吗?


14

我正在寻找一种算法来计算台球游戏中球的方向和速度。我确信必须有某种类型的开源代码,因为桌球游戏是我记得最古老的一些计算机游戏。

我的意思是,当一个球击中另一个球时,我需要一种算法来计算两个球的方向。这将取决于他们彼此碰撞的确切角度以及速度。

我想练习Java编码,所以我正在寻找具有这种类型代码的Java代码或程序包。


2
但是,如果您想自己解决问题,则可能需要一些向量知识。幸运的是,前几天有人在此站点的其他地方发布了关于线性数学精彩演练
doppelgreener 2011年

Answers:


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物理引擎?
Ricket

Box2D,Chipmunk,Bullet和ODE有Java端口,或者至少具有它们的绑定
bluescrn


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
    }
}

如果所有球都具有相同的质量,并且对于台球游戏中所有球都假定半径恒定,则可以从算法中忽略质量,但是如果没有这些简化,该代码对您将更有用。

该代码基于本教程,但我记得那里的脉冲乘法是不正确的。


如果点小于零怎么办?我一直在研究此伪代码(还有您链接的伪代码,但是另一种最终以我试图取负数的平方为准-也许这就是您所识别出的问题)。您确定要对每组输入位置和速度产生一个结果吗?

@Poldie如果点为负,则球已经相互远离。在这种情况下,无需处理碰撞。
msell 2014年

我刚刚在这里敲出了我的代码版本:ideone.com/DhsAoW,我得到-0.707的位置为110,90和100,100,速度为0,2和0,-3。这或多或少是正面碰撞。(假设已经进行了基于半径的初始碰撞检测检查)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.