ast*_*rog 4 algorithm raytracing intersection
我试图确定线段(即两点之间)是否与球体相交.我对交点的位置不感兴趣,只是该段是否与球体表面相交.有没有人对这个最有效的算法是什么有任何建议?(我想知道是否有任何算法比通常的射线球交叉算法更简单,因为我对交叉位置不感兴趣)
如果您只是知道它是否相交,那么您的基本算法将如下所示...
考虑你有光线的矢量,A - > B.
您知道此向量与球体中心之间的最短距离出现在光线矢量与矢量的交点处,该矢量与球体的中心成90度角.
因此,您有两个向量,其方程完全完全定义.您可以使用线性代数计算向量的交点,从而计算线的长度(或者更有效地计算线的长度的平方)并测试它是否小于半径(或半径的平方)你的球体.
我不知道这样做的标准方法是什么,但是如果你只想知道它是否相交,这就是我要做的.
一般规则......避免执行sqrt()或其他昂贵的操作.如果可能,处理半径的平方.
从这里开始,你的起点就在球体之外.
从现在开始,您处于更复杂的阶段.你的起点在假想的盒子和球体之间.您可以使用微积分和几何来获得简化的表达式.
您想要做的要点是确定光线和球体之间的最短距离是否小于球体的半径.
让你的光线由(x0 + i t,y0 + j t,z0 + k t)表示,并且球体的中心位于(xS,yS,zS).因此,我们希望找到这样的最小值(xS - x0 - i t,yS - y0 - j t,zS - z0 - k t).
设x = xS - x0,y = yX - y0,z = zS - z0,D =矢量平方的幅度
D = x ^ 2 -2*x i t +(i*t)^ 2 + y ^ 2 - 2*y j t +(j*t)^ 2 + z ^ 2 - 2*z k t +(k*T)^ 2
D =(i ^ 2 + j ^ 2 + k ^ 2)t ^ 2 - (x i + y j + z k)*2*t +(x ^ 2 + y ^ 2 + z ^ 2)
dD/dt = 0 = 2*t*(i ^ 2 + j ^ 2 + k ^ 2) - 2*(x i + y j + z*k)
t =(x i + y j + z*k)/(i ^ 2 + j ^ 2 + k ^ 2)
将t插回到等式D = ....如果结果小于或等于球体半径的平方,则有一个交点.如果它更大,那么就没有交集.