是否存在用于计算球体和线是否相交的优化方程式,我知道最接近的点解,但我想知道是否还有另一个。还有二次方程,但它需要大量的计算,而且我不确定所有可能的早期输出。我知道两个(我认为)......
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
}
答案 0 :(得分:1)
我认为你真的可以变得更好。您可以消除一些简单的案例。如果说线的起点和终点的x坐标小于球面中心减去半径,并且球面中心上方的坐标小于球面中心,那么就不可能。你可以考虑球体周围的立方体。如果一条线不与盒子相交,那么它就不能与球体相交。这可能更容易计算。
二次算法并没有那么糟糕。点积是三次乘法和三次加法。我认为整个事情可以通过十二次乘法完成(不包括乘以2和4)。你有可能消除其中的一些。请注意,您不需要计算平方根,这是非常昂贵的位,只需检查代码中的判别符号。
答案 1 :(得分:0)
看这里ray and ellipsoid intersection accuracy improvement
r[3]
设为(1/R*R,1/R*R,1/R*R)