【问题标题】:C++ 3D perfect collision detectionC++ 3D完美碰撞检测
【发布时间】:2010-12-13 22:55:08
【问题描述】:

我很难根据经验学习碰撞检测。我正在制作一款类似于 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 轴上尤其烦人,当玩家高速坠落时,即使定义了可观的碰撞余量,它最终也会看起来很糟糕(玩家半​​埋)。

【问题讨论】:

    标签: c++ collision-detection


    【解决方案1】:

    您发现了使用离散数学对对象路径建模的问题之一。在时间 t 对象是“这里”,而在时间 t + delta 它是“那里” - 实际上没有通过两者之间的点。

    您可以通过减少 delta 来获得更高的准确度,但最终您会达到在该时间间隔内可以计算的极限。

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

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

    对不起,我没有明确的答案,只有指针。

    【讨论】:

    • 好吧,有 2 天的代码。连续模型不仅是精确的,而且也更便宜(在这种情况下)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多