这是一个几乎与平台无关的数学问题。我有两个重叠的正方形。我需要知道“重叠深度”(一个形状进入另一个形状的程度)。我需要这些数据以允许适当的碰撞(移动玩家重叠深度)。有更简单的方法吗?或者我最好坚持以下几点;
rA
是一个矩形,所以我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
陈述,并坚持只知道它们重叠了多少。那么,有可能解决这个问题吗?
答案 0 :(得分:1)
我将假设您的方块轴对齐,但显示一种即使它们不相同也会起作用的技术。
该方法依赖于两组的Minkowski差异,这是寻找交叉点的常用技术。
两个凸形的Minkowski差异是凸的,如果两个起始集都是多边形,则得到的形状是多边形。这意味着它可以表示为一组方程,其中每个n i 是单位法线。
因此,确定两个形状是否相交的算法是:
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 }
然后是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 )
如果此深度为正,则仅发生交叉。
(注意:在我写这篇文章时,我一直在研究数学,所以我很可能在这里或那里有一个不正确的标志......随时纠正任何这样的错误......)