分离轴定理的平移方向

时间:2012-05-01 09:50:48

标签: collision-detection

我在java中实现了分离轴定理。 碰撞检测本身效果很好。 但是在解决碰撞问题时我很困惑。

我获得翻译的方法如下:

public float getOverlap(final Projection other) {
    float start = m_min > other.m_min ? m_min : other.m_min;
    float end = m_max < other.m_max ? m_max : other.m_max;
    float translation = end - start;
    return translation;
}

让我们说图片中两个矩形的投影看起来像这样。

R1.min = 2
R1.max = 8
R2.min = 5
R2.max = 11

Separating axis translation

当我检查R1与R2时,翻译将为3 当我将R2与R1相比时,翻译也将是3

现在我将翻译添加到标准化轴

Normalized axis = Vector(1,0)
Translation Vector = Vector(1,0)*3 = Vector (3,0)

现在R1和R2都向右移动了3个点,但它们可以向不同的方向移动。 R1应移动Vector(-3,0),R2应移动Vector(3,0)。

我如何计算正确的方向?

2 个答案:

答案 0 :(得分:0)

我的解决方案:

我从中心向量R2中减去中心向量R1,将点积构建到测试轴,如果点积小于0则反转平移

Vector centerR1(R1.x,R1.y);
Vector centerR2(R2.x,R2.y);

Vector R1toR2 = centerR2 - centerR1;

if(R1toR2.dot(axis)<0){
  translation = -translation
}

“当向量(R1toR2)指向负方向时,反转平移”

答案 1 :(得分:0)

只是要在这里发布另一个为我解决的答案。

尽管我似乎检查了答案中的点是否为< 0,但点积的解决方案对我来说却不起作用,而我在其他任何地方都看到该点为>= 0,所以我不确定这会改变什么。

我决定在getOverlap函数中返回正或负重叠,这将指示解决的方向。这取决于第一个对象的min小于第二个对象的min。

// Check for overlap of two 1 dimensional lines
function getLineOverlap(min1, max1, min2, max2) {
    let min = Math.max(min1, min2);
    let max = Math.min(max1, max2);

    // if negative, no overlap
    let result = Math.max(max - min, 0);

    // add positive/negative sign depending on direction of overlap
    return result * ((min1 < min2) ? 1 : -1);
};

如果这仍然不起作用,则可能需要将所得的分辨率矢量乘以-1

我从this stackoverflow answer得到了这个解决方案。