获得重叠的“深度”?

时间:2013-02-27 21:50:34

标签: math collision-detection overlap

这是一个几乎与平台无关的数学问题。我有两个重叠的正方形。我需要知道“重叠深度”(一个形状进入另一个形状的程度)。我需要这些数据以允许适当的碰撞(移动玩家重叠深度)。有更简单的方法吗?或者我最好坚持以下几点;

rA是一个矩形,所以我rB

depth.x = (rA.position.x - rB.position.x);
depth.y = (rA.position.y - rB.position.y);

这会返回一些不正确的信息,因为它不是返回重叠深度,而是返回rArB之间的距离(预期)。问题是,我无法找出找到两个对象重叠深度的公式。我是否需要以某种方式考虑对象大小,即使我已经知道存在冲突?

有人建议我可以depth.x = (rA.width/2) - (rA.position.x - rB.position.x)。但是,如果rB在左侧,那么这将不起作用,因为它会-10(example) - 50,这将是无效的(-60)。我宁愿远离冗长的if陈述,并坚持只知道它们重叠了多少。那么,有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我将假设您的方块轴对齐,但显示一种即使它们不相同也会起作用的技术。

一般结果(凸多边形)

该方法依赖于两组的Minkowski差异,这是寻找交叉点的常用技术。

两个凸形的Minkowski差异是凸的,如果两个起始集都是多边形,则得到的形状是多边形。这意味着它可以表示为一组方程n_i.x>c_i,其中每个n i 是单位法线。

因此,确定两个形状是否相交的算法是:

  1. 确定两种形状的Minkowskian差异。
  2. 确定原点是否属于Minkowskian总和(如果所有c_i<0都是真的那么
  3. 深度的度量是max(c_i)

    轴对齐正方形的特殊情况

    现在对于两个轴对齐的正方形,Minkowski和只是另一个轴对齐的正方形。 将方形A作为(cA_x,cA_y)的中心,宽度为WA,高度为HA,我们可以将其表示为:

     A = { (cA_x + a WA/2, cA_y + b HA/2), where -1<=a<=1, -1<=b<=1 }
    

    同样方形B将是:

     B = { cB_x + c WB/2, cB_y + d HB/2), where -1<=c<=1, -1<=b<=1 }
    

    然后是Minkowski的差异

     A-B = { (cA_x - cB_x + a WA/2 - c WB/2, cA_y - cB_y + b HA/2 - d HB/2), where ... }
         = { (cA_x - cB_x + r (WA-WB)/2, A_y - cB_y + s (HA-HB)/2), where -1<=s<=1, -1<=r<=1 }
    

    A-B的4个边是

     x > (cA_x-cB_x) - |WA-WB|/2
     y > (cA_y-cB_y) - |HA-HB|/2
     x < (cA_x-cB_x) + |WA-WB|/2
     y < (cA_y-cB_y) + |HA-HB|/2
    

    最后两个可以改写为

     x > -(cA_x-cB_x) - |WA-WB|/2
     y > -(cA_y-cB_y) - |HA-HB|/2
    

    因此我们发现交叉的深度是:

     min(
         (cA_x-cB_x) - |WA-WB|/2,
         (cA_y-cB_y) - |HA-HB|/2,
        -(cA_x-cB_x) - |WA-WB|/2,
        -(cA_y-cB_y) - |HA-HB|/2 )
    

    如果此深度为正,则仅发生交叉。

    (注意:在我写这篇文章时,我一直在研究数学,所以我很可能在这里或那里有一个不正确的标志......随时纠正任何这样的错误......)