Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
去年关闭。
Improve this question
有谁知道一个非常简单的物理引擎,或者仅仅一组可以完成以下任务的基本功能:简单的点,线和矩形碰撞检测?我看了Box2D,但对于我正在制作的东西来说太高级了。我只需要一些简单的代码。提前致谢!
我们可以根据参数
如果在
要找到两条线的交点,请将它们代入为
这减少到
其中q =如果 如果是
但是我们仍然不知道这个交点实际上是在
如果是
而已。因此,在您的代码中,首先要计算
为了提高速度,您可以通过
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
去年关闭。
Improve this question
有谁知道一个非常简单的物理引擎,或者仅仅一组可以完成以下任务的基本功能:简单的点,线和矩形碰撞检测?我看了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
我们可以根据参数
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次乘法运算。关于c++ - 2D碰撞检测代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3488910/