概述
几何检测主要相交性检测,这里的内容大体上是根据《3D数学基础-图形与游戏开发》这本书来的,对于这本书来说,这一部分看完了后面内容就不看了,因为后面讲的太空泛了,有点像一本绝世武功的目录一样,看似很强,其实没什么卵用。
1.2D隐式直线上的最近点
问题描述:
直线p * n = d,对于任意点q,找出直线上距离q最短的点q’
同高中解析几何简单粗暴的公式不同,这里面的算法都是基于向量来计算的。
如图所示,对于q来说,我们做另一条平行于原直线的直线,p’ * n’ = d’,显然有q * n = d’
于是两条直线分别为:
p ∗ n = d p * n = d p∗n=d
p ∗ n = q ∗ n p * n = q * n p∗n=q∗n
则其距离为d-q * n,但是我觉得是不是少除了个n的模长,这里的n应该是单位向量才正确!
然后交点就为
q’ = q + (d - q * n)n
如果n不是单位向量的话,那么距离应该等于
d − q ∗ n ∣ n ∣ \frac{d-q * n}{|n|} ∣n∣d−q∗n
2.参数射线上的最近点
问题描述:
参数射线R: p ( t ) = p o r g + t d p(t) = p_{org}+td p(t)=porg+td
d为单位向量,参数t在0到l之间变换,l是直线的长度。对于定点q,我们想要在射线R上求出距离q最近的点q’.
这个问题的求解要比上面的简单一点,本质上是一个向量的投影问题。
设 v = q − p o r g v=q-p_{org} v=q−porg,则 v ∗ d = t d v * d = td v∗d=td
这样能得出q在直线上的投影向量,我们能解出来t,然后带回到公式即可,有:
q ′ = p o r g + ( d ∗ ( q − p o r g ) ) d q' = p_{org}+(d * (q-p_{org}))d q′=porg+(d∗(q−porg))d
3.平面上最近的点
平面和直线的表达式其实是一样的,也是
p ∗ n = d p * n =d p∗n=d
最后得到的表达式其实也是一样的,但是推导过程有差别,如下图所示,设有平面pn=d,n为单位法向量,q为不在平面上的任意一点,p为其在平面上的投影
有
p + an = q
(p+an)n = qn
pn+ann = qn
d+a=qn
a=qn-d
因此有q’ = q+an = q + (d-qn)n,也就是点到直线的最近点的公式一样。
4.圆或球上的最近点
对于球心为c,半径为r的球,球外一点q,在球上求一点q’,使得q’距离q最短。
我们设向量d = c-q,
那么有 b = d ∗ ∣ d ∣ − r ∣ d ∣ b = d * \frac{|d|-r}{|d|} b=d∗∣d∣∣d∣−r
然后有q’ = q+b
则 q ′ = q + d ∗ ∣ d ∣ − r ∣ d ∣ q' = q + d * \frac{|d|-r}{|d|} q′=q+d∗∣d∣∣d∣−r
5.2D隐式直线的相交性检测
这个检测方法简单粗暴,直接联立两个方程求解即可,解的个数应对着相交、平行、重合这三种情况。
6.3D中两条射线的相交性检测
3D直线的隐式方程实际上是两个屏幕的交线,这种方式当然也可以联立四个方程,同上面一样进行求解,但这里我们讨论参数方程的情况。
设两条直线的参数方程为:
r 1 ( t 1 ) = p 1 + t 1 d 1 r_1(t_1)=p_1+t_1d_1 r1(t1)=p1+t1d1
r 2 ( t 2 ) = p 2 + t 2 d 2 r_2(t_2)=p_2+t_2d_2 r2(t2)=p