二维碰撞检测码

Mat*_*att 2 c++ math collision-detection

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

min*_*lis 6

这是我对点/线碰撞检测的镜头.重要的是要避免触发功能,划分和其他昂贵的操作,以免减慢过多的速度.

正如GMan的评论所指出的那样,你需要记住这一点将会发生变化.因此,您将获得该点的当前位置(让我们称之为A)以及该点(B)的可能新位置.你需要找出当点移动A到时B,它是否会与一条线发生碰撞.

让我们把线的起点和终点CD.只有当线ABCD相交时才会发生碰撞.

让我们AB用标准方程来描述这条线Ux + Vy + W = 0.在一些代数之后,等式出现为:

(ay - by) x + (bx - ax) y + ax by - bx ay = 0
Run Code Online (Sandbox Code Playgroud)

我们可以用CD参数t和常量来描述这条线X Y U V:

x = X + Ut
y = Y + Vt
Run Code Online (Sandbox Code Playgroud)

这是有益的,如果我们设置t=0C,并t=1在点D.通过考虑t=0我们可以解决XY.并考虑t=1我们可以制定出UV.这给了

x = cx + (dx - cx) t
y = cy + (dy - cy) t
Run Code Online (Sandbox Code Playgroud)

要找到两条线的交点,请将它们替换为我们找到的等式AB,即给出

(ay - by) (cx + (dx - cx) t) + (bx - ax) (cy + (dy - cy) t) + ax by - bx ay = 0
Run Code Online (Sandbox Code Playgroud)

这减少到

t = (ax by - bx ay + bx cy - cx by + cx ay - ax cy) / q
Run Code Online (Sandbox Code Playgroud)

其中q = (ay - by)(cx - dx) - (ax - bx)(cy - dy)

  • 如果q为零,则线条平行且不相交.
  • 如果0 < t < 1那么从AB交叉推断出的线CD.

但是,我们仍然不知道,这个路口实际上是点之间的AB.因此,我们需要重复所有前面的步骤,交换AB和根据参数CD写入行.这给出了:ABs

s = (cx dy - dx cy + dx ay - ax dy + ax cy - cx ay) / q
Run Code Online (Sandbox Code Playgroud)
  • 如果0 < s < 1那么从CD交叉推断出的线AB.

而已.所以在你的代码中,你从计算开始q.如果q为零,那么线是平行的.否则,继续计算ts.如果0 < t < 10 < s < 1随后的碰撞即将发生.要找到碰撞的位置,请替换ts返回原始方程式CD.

对于额外的速度,您可以通过以下方式删除分区q- 可以只检查每个分数的上半部分是否在正确的范围内,然后每个检查只需要10次乘法运算.