0%

08 - 两个 圆_球 的相交性检测

两个 圆_球 的相交性检测

使用球心 c1\bold{c_1}c2\bold{c_2} 和半径 r1r_1r2r_2 定义的两个球,设 dd 为球心间的距离。

显然,当 d<r1+r2d < r_1 + r_2 时它们相交;在实现时通过比较 d2<(r1+r2)2d^2 < (r_1 + r_2)^2 ,可以避免包括计算 dd 在内的平方根运算。

screenShot.png

图1 两个球相交

screenShot.png

图2 两个运动的球

screenShot.png

图3 认为其中一个球是静止的,并组合运动向量

screenShot.png

图4 球和圆的动态检测

为了计算 tt ,得先计算从 cm\bold{c_m} 指向 cs\bold{c_s} 的临时向量 e\bold{e} ,并设半径的和为 rr

e=cscmr=rm+rs\begin{aligned} \bold{e} &= \bold{c_s} - \bold{c_m} \\ r &= r_m + r_s \end{aligned}

根据 cos 定理:

r2=t2+e22tecosθr^2 = t^2 + \Vert{\bold{e}}\Vert^2 - 2t\Vert{\bold{e}}\Vert \cos\theta

应用点乘的集合解释,化简可得:

r2=t2+e22tecosθr2=t2+ee2t(ed)0=t22(ed)t+eer2\begin{aligned} r^2 &= t^2 + \Vert{\bold{e}}\Vert^2 - 2t\Vert{\bold{e}}\Vert \cos\theta \\ r^2 &= t^2 + \bold{e} \cdot \bold{e} - 2t(\bold{e} \cdot \bold{d}) \\ 0 &= t^2 - 2(\bold{e} \cdot \bold{d})t + \bold{e} \cdot \bold{e} - r^2 \end{aligned}

应用二次求根公式:

0=t22(ed)t+eer2t=2(ed)±(2(ed))24(eer2)2t=2(ed)±4(ed)24(eer2)2t=(ed)±(ed)2ee+r2)\begin{aligned} 0 &= t^2 - 2(\bold{e} \cdot \bold{d})t + \bold{e} \cdot \bold{e} - r^2 \\[2ex] t &= \cfrac{2(\bold{e} \cdot \bold{d}) \plusmn \sqrt{(-2(\bold{e} \cdot \bold{d}))^2 - 4(\bold{e} \cdot \bold{e} - r^2)}}{2} \\[2ex] t &= \cfrac{2(\bold{e} \cdot \bold{d}) \plusmn \sqrt{4(\bold{e} \cdot \bold{d})^2 - 4(\bold{e} \cdot \bold{e} - r^2)}}{2} \\[2ex] t &= (\bold{e} \cdot \bold{d}) \plusmn \sqrt{(\bold{e} \cdot \bold{d})^2 - \bold{e} \cdot \bold{e} + r^2)} \end{aligned}

其中,

  • 较小的值(负根)是两个球开始接触时的 tt 值;
  • 较大的根(正根)是两个球脱离接触时的 tt 值。

t=(ed)±(ed)2ee+r2)t = (\bold{e} \cdot \bold{d}) \plusmn \sqrt{(\bold{e} \cdot \bold{d})^2 - \bold{e} \cdot \bold{e} + r^2)}

NOTE

  • e<r\Vert{\bold{e}}\Vert < r,则球在 t=0t = 0 时就相交;
  • 若 $ t < 0$ 或 t>lt > l ,那么在所讨论的时间段内两个球不会发生接触;
  • 如果根号内的值是负的,那么两个球不会相交。