0

您可能认为这已经得到了回答,但事实并非如此。因为它不能仅仅通过在某个时间检查实际的交叉点来真正回答。

在此处输入图像描述

在图像中,“侧击”取决于最后的位置。如果矩形是从上面来的,那么大矩形的侧面就是底部。但如果矩形来自右侧,则侧击将是正确的。

所有这一切都让我很烦恼,因为我能够为我的游戏子弹(即快速物体)实现一个有点复杂的碰撞检测,我认为简单的碰撞将是最简单的。但是由于我实际上必须做出响应,而不仅仅是检测,所以简单的碰撞算法变得很痛苦。

我的问题是如何实现一个实际功能强大且完美无瑕的碰撞算法,该算法可以依赖于交叉点但准确,例如使用最后一个位置或一些外部资源来实际计算最佳答案。当然,这只会在角落给我带来麻烦。但它不能在任何地方造成麻烦。

(使用最后一个位置似乎是显而易见的答案,但我不知道如何处理信息以达到输出,这就是我提出问题的原因,我试过了,但现在我的大脑受伤了)

4

2 回答 2

1

我打算给出一个深入的答案,但这篇文章的公认答案几乎总结了我要说的内容。这是人们第一次尝试基本碰撞检测时遇到的常见问题。这个问题的解决方案比你想象的要复杂,它们基本上围绕着计算物体在碰撞点的位置。

编辑:要弄清楚两个物体碰撞的确切时间,您可以执行以下操作:(未测试)

onCollide(obj1, obj2)
{
    t = 0; //parametric value to store when objects first collided
    // calculate when the obj1's left side collides with obj2's right side
    // parametric equation is obj1.left + obj1.vel.x * t = obj2.right + obj2.vel.x * t
    // solving for t: t = (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x)
    // we take the minimum because that is when the first sides collided
    t = math.min(t, (obj1.left - obj2.right) / (obj2.vel.x - obj1.vel.x))
    t = math.min(t, (obj1.right - obj2.left) / (obj2.vel.x - obj1.vel.x))// repeat for other sides
    t = math.min(t, (obj1.top - obj2.bottom) / (obj2.vel.y - obj1.vel.y))
    t = math.min(t, (obj1.bottom - obj2.top) / (obj2.vel.y - obj1.vel.y))
}

如果需要,您可以利用这段时间倒回整个模拟。或者您可以只查看这两个对象的状态。除了使用 min 函数,您还可以使用 if 语句并跟踪哪两个边首先发生碰撞。请记住,此计算不会跟踪在该时间步可能发生碰撞的多个对象,但通常这是一个有效的近似值。还要记住,当两个物体在一个维度上以相同的速度行进而不是另一个维度时,您应该避免除以零。

于 2013-07-21T03:05:47.320 回答
0

相交测试绝不是制造“完美”碰撞的方法。速度越高,良好回调或任何回调的可能性就越小。使用 box2d 之类的物理引擎或创建自己的(不推荐)。

对于侧面的相交测试,您可以看到碰撞对象的边界(矩形)与其大小相关。

于 2013-07-21T03:00:29.303 回答