基于交叉口的碰撞检测确定侧面碰撞

时间:2013-07-21 02:41:41

标签: java algorithm collision-detection

你可能认为这已经得到了回答,但事实并非如此。因为仅仅通过在特定时间检查实际交叉点才能真正回答它。

enter image description here

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

所有这些都让我感到烦恼,因为我能够为我的游戏子弹实现一些复杂的碰撞检测,即快速对象,我认为简单的碰撞将是最简单的。但是,由于我实际上必须回应,而不仅仅是检测,简单的碰撞算法变得很痛苦。

我的问题是如何实现一个实际功能和完美的碰撞算法,它可以依赖于交叉点但是准确,就像使用最后一个位置或一些外部资源来实际计算最佳答案一样。当然,这只会让我在拐角处遇到麻烦。但它不会在任何地方造成麻烦。

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

2 个答案:

答案 0 :(得分:1)

我打算给出一个深入的答案,但this post接受的答案几乎总结了我要说的内容。这是人们在首次尝试基本碰撞检测时遇到的常见问题。这个问题的解决方案比你想象的要复杂得多,它们主要围绕计算碰撞点对象的位置。

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

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

使用此时间,您可以根据需要回退整个模拟。或者你可以看看这两个对象的状态。您可以使用if语句而不是使用min函数,并跟踪哪两个方面首先相互冲突。请记住,此计算不会跟踪在该时间步骤中可能发生碰撞的多个对象,但通常这是一个有效的近似值。另外请记住,当两个物体在一个维度上以相同的速度行进而不是另一个维度时,应该避免除以零。

答案 1 :(得分:0)

交叉测试永远不是实现“完美”碰撞的方法。速度越高,良好回调或任何回调的可能性就越小。使用像box2d这样的物理引擎或创建自己的(不推荐)。

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