0%

07 - 射线和 圆_球 的相交性检测

射线和 圆_球 的相交性检测

由于可以在包含射线和球心的平面中进行检测,所以先讨论2D中射线和圆的相交性检测,该检测的方法也适用于3D中射线和球之间的相交性检测。

screenShot.png

  • 球的定义:圆心 c\bold{c} 和半径 rr
     
  • 射线的定义p(t)=p0+td\bold{p}(t) = \bold{p}_0 + t\bold{d}
    d\bold{d} 为单位向量,tt 从 0 变化到 llll 为射线长度

所要求的是交点处 tt 的值:t=aft = a - f

  • 计算 aa
    • e\bold{e} 为从 p0\bold{p_0} 指向 c\bold{c} 的向量:

    e=cp0\bold{e} = \bold{c} - \bold{p_0}

    • e\bold{e} 投影到 d\bold{d} ,这个向量的长度为 aa

    a=eda = \bold{e} \cdot \bold{d}

 

  • 计算 ff

f2+b2=r2a2+b2=e2b2=e2a2\begin{aligned} f^2 + b^2 = r^2 \\ a^2 + b^2 = e^2 \\ b^2 = e^2 - a^2 \end{aligned}

ee 是从射线起点到圆心之间的距离,也就是向量 e\bold{e} 的长度,因此, e2e^2 为:

e2=eee^2 = \bold{e} \cdot \bold{e}

代入化简得到 ff

f2+b2=r2f2+(e2a2)=r2f2=r2e2+a2f2=r2e2+a2\begin{aligned} &f^2 + b^2 = r^2 \\ &f^2 + (e^2 - a^2) = r^2 \\ &f^2 = r^2 - e^2 + a^2 \\ &f^2 = \sqrt{r^2 - e^2 + a^2} \end{aligned}

  • 最后求得 tt

    t=af=ar2e2+a2\begin{aligned} t &= a - f \\ &= a - \sqrt{r^2 - e^2 + a^2} \end{aligned}

NOTE

  • r2e2+a2r^2 - e^2 + a^2 为负,则射线和圆不相交;
  • 射线的起点可能在圆内,此时 e2<r2e^2 < r^2 。此时,根据不同的测试目的,会有不同的行为。