有没有人知道一个非常简单的物理引擎,或者只是一组可以完成这些任务的基本功能:简单的点,线和矩形碰撞检测?我看了Box2D,但它对于我正在制作的东西来说太先进了。我只需要一些简单的代码。提前谢谢!
答案 0 :(得分:5)
这是我在点/线碰撞检测中的镜头。重要的是避免触发功能,分割和其他昂贵的操作,以免减慢过多的速度。
正如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
我们可以根据参数CD
和常量t
描述行X Y U V
:
x = X + Ut
y = Y + Vt
如果我们在点t=0
设置C
,在点t=1
设置D
会很有帮助。通过考虑t=0
,我们可以制定X
和Y
。通过考虑t=1
,我们可以确定U
和V
。这给了
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
相交。但我们仍然不知道这个交叉点实际上在点A
和B
之间。因此,我们需要重复之前的所有步骤,交换AB
和CD
,并根据参数AB
编写行s
。这给出了:
s = (cx dy - dx cy + dx ay - ax dy + ax cy - cx ay) / q
0 < s < 1
,则从CD
推断的行与AB
相交。就是这样。因此,在您的代码中,您首先要计算q
。如果q
为零,那么这些线是平行的。否则,请继续计算t
和s
。如果0 < t < 1
和0 < s < 1
则即将发生碰撞。要查找碰撞的位置,请将t
或s
替换为CD
的原始等式。
对于额外的速度,您可以通过q
删除除法 - 可以只检查每个分数的上半部分是否在正确的范围内,然后每个检查只需要10次乘法运算。
答案 1 :(得分:0)
是否有理由不能使用基本几何图形?
当坐标相同时,两个点会发生碰撞。
当一个点的位置是该线的等式的解时,该点与一条线相交。
当点由矩形界定时,点与矩形相交。
通过组合这些案例,可以构建更复杂的复合案例。你出于某种原因特意寻找图书馆吗?