测试线段是否与球体相交

ast*_*rog 4 algorithm raytracing intersection

我试图确定线段(即两点之间)是否与球体相交.我对交点的位置不感兴趣,只是该段是否与球体表面相交.有没有人对这个最有效的算法是什么有任何建议?(我想知道是否有任何算法比通常的射线球交叉算法更简单,因为我对交叉位置不感兴趣)

Cru*_*han 9

如果您只是知道它是否相交,那么您的基本算法将如下所示...

考虑你有光线的矢量,A - > B.

您知道此向量与球体中心之间的最短距离出现在光线矢量与矢量的交点处,该矢量与球体的中心成90度角.

因此,您有两个向量,其方程完全完全定义.您可以使用线性代数计算向量的交点,从而计算线的长度(或者更有效地计算线的长度的平方)并测试它是否小于半径(或半径的平方)你的球体.

  • 谢谢你.我一直在这个页面上的其他更高级别的答案摇头.特别是那些以"我不知道这样做的标准方式"开头的,当我给出的答案是这样做的标准方式:-) (2认同)
  • 不,这不是正确的答案,这只对一行有效。该问题明确要求两点之间有一条线段。 (2认同)

Spa*_*rky 6

我不知道这样做的标准方法是什么,但是如果你只想知道它是否相交,这就是我要做的.

一般规则......避免执行sqrt()或其他昂贵的操作.如果可能,处理半径的平方.

  1. 确定起点是否在球体半径范围内.如果您知道情况从未如此,请跳过此步骤.如果你在里面,你的光线将与球体相交.

从这里开始,你的起点就在球体之外.

  1. 现在,想象一下适合球体的小盒子.如果您在该框之外,请检查光线的x方向,y方向和z方向,以查看它是否将与光线所在的框的侧面相交.这应该是一个简单的符号检查,或与零比较.如果你在外面并远离它,你永远不会相交它.

从现在开始,您处于更复杂的阶段.你的起点在假想的盒子和球体之间.您可以使用微积分和几何来获得简化的表达式.

您想要做的要点是确定光线和球体之间的最短距离是否小于球体的半径.

让你的光线由(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 = ....如果结果小于或等于球体半径的平方,则有一个交点.如果它更大,那么就没有交集.