Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

去年关闭。



Improve this question




有谁知道一个非常简单的物理引擎,或者仅仅一组可以完成以下任务的基本功能:简单的点,线和矩形碰撞检测?我看了Box2D,但对于我正在制作的东西来说太高级了。我只需要一些简单的代码。提前致谢!

最佳答案

这是我在点/线碰撞检测上的镜头。重要的是要避免触发函数,除法和其他昂贵的操作,以免减慢速度。

正如GMan的评论所指出的那样,您需要牢记这一点将会改变。因此,您将获得该点的当前位置(我们将其称为A)和该点的可能新位置(B)。您需要确定当点从A移到B时,是否会与直线碰撞。

我们将其称为CD行的起点和终点。仅当ABCD行相交时,才会发生冲突。

让我们使用标准方程AB描述Ux + Vy + W = 0行。经过一些代数运算后,方程式如下:

(ay - by) x + (bx - ax) y + ax by - bx ay = 0

我们可以根据参数CD和常量t来描述X Y U V行:
x = X + Ut
y = Y + Vt

如果在t=0点设置C,在t=1点设置D,这将很有帮助。通过考虑t=0,我们可以算出XY。通过考虑t=1,我们可以算出UV。这给
x = cx + (dx - cx) t
y = cy + (dy - cy) t

要找到两条线的交点,请将它们代入为AB找到的方程式中
(ay - by) (cx + (dx - cx) t) + (bx - ax) (cy + (dy - cy) t) + ax by - bx ay = 0

这减少到
t = (ax by - bx ay + bx cy - cx by + cx ay - ax cy) / q

其中q = (ay - by)(cx - dx) - (ax - bx)(cy - dy)
  • 如果q为零,则这些行是平行的并且不相交。
  • 如果是0 < t < 1,则从AB推断出的线与CD相交。

  • 但是我们仍然不知道这个交点实际上是在AB点之间。因此,我们需要重复前面的所有步骤,交换ABCD,并根据参数AB编写行s。这给出:
    s = (cx dy - dx cy + dx ay - ax dy + ax cy - cx ay) / q
    
  • 如果是0 < s < 1,则从CD推断出的线与AB相交。

  • 而已。因此,在您的代码中,首先要计算q。如果q为零,则这些行是平行的。否则,继续计算ts。如果是0 < t < 10 < s < 1,则将发生冲突。要找到碰撞的位置,请将ts替换回CD的原始方程式中。

    为了提高速度,您可以通过q删除除法-可以仅检查每个分数的上半部分是否在正确的范围内,然后每次检查仅需要进行10次乘法运算。

    关于c++ - 2D碰撞检测代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3488910/

    10-11 22:54
    查看更多