台球中的大多数碰撞检测算法都使用一种简单的方法,即增加球的位置,然后检查碰撞。当速度非常高时,这种方法效果不佳,因为我们可能会“跳过”碰撞。
我一直在寻找一种方法来预先计算台球比赛中球的轨迹。一旦知道了轨迹,我就可以为球设置动画,直到它们停止移动。而且我不必担心速度,因为碰撞是在数学上检测和解决的。
你知道有没有人这样做过?我不想重新发明轮子。谢谢你。
台球中的大多数碰撞检测算法都使用一种简单的方法,即增加球的位置,然后检查碰撞。当速度非常高时,这种方法效果不佳,因为我们可能会“跳过”碰撞。
我一直在寻找一种方法来预先计算台球比赛中球的轨迹。一旦知道了轨迹,我就可以为球设置动画,直到它们停止移动。而且我不必担心速度,因为碰撞是在数学上检测和解决的。
你知道有没有人这样做过?我不想重新发明轮子。谢谢你。
简单的方法是仅使用具有非常精细步长的“幼稚”方法,但实际上还没有为球设置动画。
从四叉树开始,让你的采样间隔更小。但是,如果您的台球移动得如此之快以至于它们穿过其他球,那么您对游戏的建模不正确。你有没有玩过台球游戏,球实际上移动得那么快?
或者
在您的时间步长之间,将球的先前位置和当前位置建模为二维圆柱体。如果任何两个圆柱体发生碰撞,请减小时间步长并重试。以这种方式,您可以获得非常快速的一般计算,并且您仍然可以处理超高速。
我为类似的事情实施的一种解决方案是使用可变时间步长。
实现是这样的:你有一个时间参数化的方法来确定球的位置(在当前时间 T 加上可变时间 V);默认值是指定 V 为 1.0。在计算更新位置时,可以进行碰撞检测;碰撞检测的自然产物是碰撞发生时间的分数指标。如果发生这种情况,请重置当前迭代的位置,并使用小数 V 重新提交所有移动,然后迭代 1.0 - V 的量。
这工作得非常好,并且具有相对简单的实现的好处。需要关注的一点是,您需要足够的 CPU 能力才能在“自然”时间片(即,一个显示帧等)内多次计算移动。但是,由于这种类型的计算对于现代处理器来说非常容易,所以这应该不是问题。
很多年前我做过类似的事情,并将球的运动描述为时间的函数。使用这种方法,我能够找到任意两个球相交的确切时间。每个球在队列的头部保留一个交叉时间最短的优先队列,当发生碰撞时将调整队列。这很有效,第一次传球很容易,对球没有加速。后来(通过一些更难的数学运算)我还能够将其扩展为添加摩擦。
这种方法的主要缺点是计算往往同时发生,然后暂时什么都没有,而不是能够每帧做一点工作。这意味着您的帧速率将不稳定。它并没有对我 8 年前运行的硬件造成任何明显的故障。即使在休息时,或者奇怪的或多或少不可能的情况下,比如几个球在撞到墙上时完全接触并朝同一个方向移动,也会导致帧率下降,但没有什么明显的。