免责声明:此方法在某些情况下不起作用。我在发布答案后发现了这一点。但是,对于简单的用例,结果可能已经足够好了,这就是我将这个答案留在这里的原因。
在如下图所示的情况下,我的方法返回 false。
原答案:
我现在已经多次看到这个问题,但我设法想出了一个非常简单的解决方案:
为了检查两个球体之间的碰撞,我们通常希望使用它们的半径并查看它是否小于两个球体之间的距离。
对于椭球体,我们可以尝试做同样的事情。然而,整个椭球的半径是不同的。但这很容易实现,我们只需要知道我们想要获得半径的方向即可。
float EllipsoidRadius(VECTOR ellipsoidRadius, VECTOR direction)
{
direction /= ellipsoidRadius;
normalize(direction);
return length(direction * ellipsoidRadius);
// The * is just a multiplication
}
我们知道我们的方向,这只是我们一个椭球体的位置减去另一个椭球体的位置。我们可以使用这个方向来获得两个椭圆体的半径,因为半径在相对两侧总是相等的(只要我们有轴对齐的椭圆体)。
bool EllipsoidIntersects(POINT positionA, VECTOR sizeA, POINT positionB, VECTOR sizeB)
{
VECTOR direction = positionA - positionB;
float distance = length(direction);
float radiusA = EllipsoidRadius(sizeA, direction);
float radiusB = EllipsoidRadius(sizeB, direction);
return distance < radiusA + radiusB;
}
现在我们知道了两个椭球的半径,我们可以使用良好的旧球体碰撞检查来查看它们是否发生碰撞。