C ++ 3D完美碰撞检测

时间:2010-12-13 22:55:08

标签: c++ collision-detection

我很难通过经验学习碰撞检测。我正在制作一个盒装游戏,我的Minecraft,我正处于实施碰撞检测的阶段。

我已经完成了x和y轴',因为所有内容都由立方体组成,我想制作自己的碰撞探测器并使其尽可能轻。

有没有办法让“像素完美”碰撞,也就是当玩家的边界框(或圆圈)接触到它注册为碰撞的盒子时?现在这就是我所做的:

if(-TOUCH_DISTANCE-1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE-1)
{
    collisionNorth = true;
}
if(-TOUCH_DISTANCE+1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE+1)
{
    collisionSouth = true;
}

它基本上检测到一定范围内的碰撞,这意味着错误,我不喜欢:(。注意+/- 1将“碰撞墙”抵消到框的相应侧。

这可以在较低的速度下工作,但是一旦有一些动作(当我破解速度变量时)就不能再检测到碰撞,因为我走得太快并且直接穿过立方体......有没有办法使它成为wallhax0r证明?

这在z轴上尤其令人讨厌,当玩家高速下降时,即使定义了一个可观的碰撞边缘,它最终也会显得很讨厌(玩家半埋)。

2 个答案:

答案 0 :(得分:3)

您已经确定了使用离散数学来建模对象路径的问题之一。在时间t,对象是“在这里”,在时间t + delta它是“那里” - 实际上没有通过它们之间的点。

您可以通过降低增量来获得更高的准确度,但最终您将达到在该时间间隔内可以计算的限制。

如果你可以通过使用相对较大的时间增量和松散的边界框来检测碰撞接近,那么你可以提高准确度,但是你将再次达到极限。

转换为连续模型可能有所帮助 - 但可能需要更多的计算能力。当你的物体关闭时你可以切换到这个,这样你就不会一直这样做。

抱歉,我没有明确答案,只有指针。

答案 1 :(得分:2)

通常您需要做的是跟踪对象的先前位置以及当前位置。然后,当您更新时,您可以检查对象是否在该时间段内相交,而不是“它们在此刻相交”。