我在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
当我检查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)。
我如何计算正确的方向?
答案 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得到了这个解决方案。