仅优化的球形线检查?

时间:2014-08-29 06:27:16

标签: c++ algorithm math optimization

是否存在用于计算球体和线是否相交的优化方程式,我知道最接近的点解,但我想知道是否还有另一个。还有二次方程,但它需要大量的计算,而且我不确定所有可能的早期输出。我知道两个(我认为)......

Vec3 d = lineEnd - lineStart; // the ray
Vec3 f = lineStart - sphereCenter; // center -> lineStart


float c = dot(f, f) - radius * radius;

if(c <= 0)
{
    // first out
    // sphere is touching the vertex
    // hit !
}

float b = dot(f, d);

if(b >= 0)
{
    // second out
    // line ray and center -> start, are going same direction
    // if the start point didn't intersect above
    // then there's no way for the segment or other point to
    // miss
}

float a = dot(d, d);

// ... any other optimizations

if(b*b - a*c < 0)
{
    // miss
}

2 个答案:

答案 0 :(得分:1)

我认为你真的可以变得更好。您可以消除一些简单的案例。如果说线的起点和终点的x坐标小于球面中心减去半径,并且球面中心上方的坐标小于球面中心,那么就不可能。你可以考虑球体周围的立方体。如果一条线不与盒子相交,那么它就不能与球体相交。这可能更容易计算。

二次算法并没有那么糟糕。点积是三次乘法和三次加法。我认为整个事情可以通过十二次乘法完成(不包括乘以2和4)。你有可能消除其中的一些。请注意,您不需要计算平方根,这是非常昂贵的位,只需检查代码中的判别符号。

答案 1 :(得分:0)

看这里ray and ellipsoid intersection accuracy improvement

  • 只需将r[3]设为(1/R*R,1/R*R,1/R*R)
  • 即可
  • 或将方程更新为奇异半径(可以将整个方程乘以1 /(R * R))
  • 在当前状态下,它需要3 x三个点,1 x sqrt,2 x div和一些小操作,如+, - ,*