代码之家  ›  专栏  ›  技术社区  ›  Matt

二维碰撞检测码[关闭]

  •  2
  • Matt  · 技术社区  · 16 年前

    有没有人知道一个非常简单的物理引擎,或者仅仅是一组基本的功能可以完成这些任务:简单的点、线和矩形碰撞检测?我看了一下Box2D,但它太先进了,我做不到。我只需要一些简单的代码。事先谢谢!

    2 回复  |  直到 13 年前
        1
  •  5
  •   minimalis    16 年前

    这是我在点/线碰撞检测时拍摄的照片。重要的是要避免三角函数、除法和其他昂贵的操作,以免太慢。

    正如gman的评论所指出的那样,你需要记住,这一点将会发生变化。所以你将得到点的当前位置(我们称之为 A )以及该点可能的新位置( B )你需要找出当点从 一 到 乙 它会与一条线相撞。

    我们来计算这条线的起点和终点 C 和 D . 只有当线条 AB 和 CD 横断。

    我们来描述一下这条线 抗体 使用标准方程 Ux + Vy + W = 0 . 经过一些代数运算后,方程式得出:

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

    我们可以描述这条线 光盘 就参数而言 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
    

    为了找到这两条线的交点,把它们代入我们找到的方程中。 抗体 ,这给了

    (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 然后,从 抗体 相交 光盘 .

    但我们仍然不知道这个交叉点实际上是在两个点之间 一 和 乙 . 所以我们需要重复前面的所有步骤,交换 抗体 和 光盘 然后写下这行 抗体 就参数而言 s . 这给出:

    s = (cx dy - dx cy + dx ay - ax dy + ax cy - cx ay) / q
    
    • 如果 0 < s < 1 然后,从 光盘 相交 抗体 .

    就是这样。所以在代码中,首先要计算 Q . 如果 Q 是零,则线条是平行的。否则,继续计算 T 和 S . 如果 0 & lt;t & lt;1 和 0 & lt;s & lt;1 然后就要发生碰撞了。要查找碰撞的位置,请替换 T 或 S 回到原来的方程 光盘 .

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

        2
  •  0
  •   Gian    16 年前

    你为什么不能用基本几何学?

    两个点的坐标相同时会发生碰撞。

    当点的位置是直线方程的解时,点与直线相交。

    当点以矩形为边界时,点与矩形相交。

    通过组合这些案例,可以构建更复杂的复合案例。你是因为某种原因专门找图书馆的吗?

    推荐文章