如何预先计算台球(池)游戏中的轨迹?

时间:2009-12-14 23:12:03

标签: collision-detection pool billiards

台球中的大多数碰撞检测算法使用天真的approch,其中球的位置递增,然后检查碰撞。当速度非常高时,这种方法效果不好,因为我们可能会“跳过”碰撞。

我一直在寻找一种在台球比赛中预先计算球的轨迹的方法。一旦知道了轨迹,我就可以为这些球设置动画,直到它们停止移动为止。而且我不必担心速度,因为碰撞是通过数学方法检测和解决的。

你知道是否有人这样做过吗?我不想重新发明轮子。 谢谢。

4 个答案:

答案 0 :(得分:1)

简单的方法是只使用非常精细步长的“天真”方法,但实际上并没有为球制作动画。

答案 1 :(得分:1)

从四叉树开始,使您的采样间隔更小。但是,如果你的台球移动速度太快以至于它们通过其他球,你就会错误地模拟游戏。你有没有打过一场台球比赛,球在那里快速移动了?

<强>替代地

在您的时间步长之间,将球的先前位置和当前位置建模为二维圆柱体。如果任何两个气缸发生碰撞,请将时间步长缩小,然后重试。通过这种方式,您可以获得非常快速的一般计算,并且您仍然可以处理超高速度。

答案 2 :(得分:1)

我为类似的东西实现的一个解决方案是使用可变时间步骤。

实现如下:你有一个时间参数化方法来确定球的位置(在当前时间T加上可变时间V);默认是指定V为1.0。在计算更新位置时,可以执行碰撞检测;碰撞检测的自然伪影是碰撞发生时的分数指示。如果发生这种情况,请重置当前迭代的位置,然后使用小数V重新提交所有移动,然后迭代1.0 - V的数量。

这非常有效,并且具有相对简单的实现的好处。一个值得关注的问题是,您需要足够的CPU功率才能在“自然”时间片(即一个显示帧等)期间多次计算移动。但是,由于这种类型的计算对于现代处理器来说非常容易,这应该不是问题。

答案 3 :(得分:1)

多年前我做了类似的事情,并描述了球位置随时间变化的运动。使用这种方法,我能够找到任何两个球的确切交叉时间。每个球保持一个优先级队列,在队列的头部有最小的交叉时间,并且在发生碰撞时将调整队列。这非常有效,并且对于第一次传球来说非常容易,这对球没有任何影响。后来(有一些更难的数学)我也能够将它扩展到加入摩擦力的工作。

这种方法的主要缺点是计算倾向于一次性发生,然后暂时没有发生,而不是每帧都能做一点工作。这意味着您的帧率将不稳定。它在8年前运行的硬件上没有引起任何明显的故障。即使在休息时间,或者奇怪的或多或少不可能的情况,例如几个球在撞到墙壁时完全接触并向同一方向移动时,这将是帧率的下降,但不是任何明显的。