2

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

rA是一个矩形,所以 ia rB

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

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

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

4

1 回答 1

1

我将假设您的正方形轴对齐,但展示一种即使它们不是也可以工作的技术。

一般结果(凸多边形)

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

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

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

  1. 确定两种形状的闵可夫斯基差。
  2. 确定原点是否落入闵可夫斯基和内(如果所有 都为真c_i<0

然后是深度的度量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 }

那么闵可夫斯基差是

 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 }

那么的 4 个边A-B

 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 )

仅当此深度为正时才会发生相交。

(注意:我在写这篇文章时一直在计算数学,所以很可能我在这里或那里有一个不正确的符号......请随时纠正任何此类错误......)

于 2013-02-28T01:16:37.327 回答