本文主要介绍如何判定一条线和一个球面相交
1、第一种是代入法
2、优化后的方法
其中只介绍数学相关,代码实现可自行实现
1、代入法判定射线和球是否相交
我们假设射线为 L ( t ) = t d ⃗ + P L(t) =t\vec{d}+P L(t)=td+P,其中P为射线起点, d ⃗ \vec{d} d为射线的方向
因为射线与球相交可以等价为射线和球面相交,因此我们假设球面方程为
F ( X ) = ( X − C ) 2 = R 2 F(X) = (X-C)^2 = R^2 F(X)=(X−C)2=R2,其中X是球面上的点,C为球心,R为球的半径
我们把射线上的点带入球面方程中可得到
( t d ⃗ + P − C ) 2 = R 2 ( 1 ) (t\vec{d}+P-C)^2 = R^2(1) (td+P−C)2=R2(1)
即
d ⃗ t 2 + 2 t [ d ⃗ ( P − C ) ] + ( P − C ) 2 − R 2 = 0 \vec{d}t^2 + 2t[\vec{d}(P-C)]+(P-C)^2-R^2 = 0 dt2+2t[d(P−C)]+(P−C)2−R2=0
这就是一个一元二次方程的形式 a t 2 + 2 b t + c = 0 at^2+2bt+c = 0 at2+2bt+c=0
因此我们可以用判别式去判断相交情况,即 ▲ = b 2 − 4 a c ▲=b^2-4ac ▲=b2−4ac
▲>0,两个交点;
▲=0,一个交点;
▲<0,没有相交;
接下去两个交点的求法就用
−
b
±
▲
2
4
a
c
\frac{-b±\quad \sqrt[2]{▲}}{4ac}
4ac−b±2▲去求解
2、优化法判定射线和球是否相交
同样假设射线为
L
(
t
)
=
t
d
⃗
+
P
L(t) =t\vec{d}+P
L(t)=td+P,其中P为射线起点,
d
⃗
\vec{d}
d为射线的方向,如下**图(a)**所示,
a
⃗
=
C
−
P
\vec{a} = C-P
a=C−P,则
① 如果
∣
a
⃗
∣
2
≤
R
2
|\vec{a}|^2≤R^2
∣a∣2≤R2,此时必定相交,因为点P在球内,如图(c)
② 如果
∣
a
⃗
∣
2
>
R
2
|\vec{a}|^2>R^2
∣a∣2>R2,此时计算
a
⃗
在
d
⃗
上
的
投
影
l
=
a
⃗
⋅
d
⃗
,
如
果
l
<
0
,
\vec{a}在\vec{d}上的投影l=\vec{a}·\vec{d},如果l<0,
a在d上的投影l=a⋅d,如果l<0,证明球在射线后面,则一定不相交,如图(b)
③求 球心和
l
l
l 的距离
m
,
m
2
=
a
−
l
2
,
如
果
m
2
≤
R
2
,
则
相
交
,
反
之
不
相
交
m ,m^2=a^-l^2,如果m^2≤R^2, 则相交,反之不相交
m,m2=a−l2,如果m2≤R2,则相交,反之不相交,如图(a)