Mat*_*att 2 c++ math collision-detection
有没有人知道一个非常简单的物理引擎,或者只是一组可以完成这些任务的基本功能:简单的点,线和矩形碰撞检测?我看了Box2D,但它对于我正在制作的东西来说太先进了.我只需要一些简单的代码.提前致谢!
这是我对点/线碰撞检测的镜头.重要的是要避免触发功能,划分和其他昂贵的操作,以免减慢过多的速度.
正如GMan的评论所指出的那样,你需要记住这一点将会发生变化.因此,您将获得该点的当前位置(让我们称之为A
)以及该点(B
)的可能新位置.你需要找出当点移动A
到时B
,它是否会与一条线发生碰撞.
让我们把线的起点和终点C
和D
.只有当线AB
和CD
相交时才会发生碰撞.
让我们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=0
点C
,并t=1
在点D
.通过考虑t=0
我们可以解决X
和Y
.并考虑t=1
我们可以制定出U
和V
.这给了
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
.但是,我们仍然不知道,这个路口实际上是点之间的A
和B
.因此,我们需要重复所有前面的步骤,交换AB
和根据参数CD
写入行.这给出了:AB
s
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
为零,那么线是平行的.否则,继续计算t
和s
.如果0 < t < 1
和0 < s < 1
随后的碰撞即将发生.要找到碰撞的位置,请替换t
或s
返回原始方程式CD
.
对于额外的速度,您可以通过以下方式删除分区q
- 可以只检查每个分数的上半部分是否在正确的范围内,然后每个检查只需要10次乘法运算.