几何检测

概述

几何检测主要相交性检测,这里的内容大体上是根据《3D数学基础-图形与游戏开发》这本书来的,对于这本书来说,这一部分看完了后面内容就不看了,因为后面讲的太空泛了,有点像一本绝世武功的目录一样,看似很强,其实没什么卵用。

1.2D隐式直线上的最近点

问题描述:
直线p * n = d,对于任意点q,找出直线上距离q最短的点q’
在这里插入图片描述
同高中解析几何简单粗暴的公式不同,这里面的算法都是基于向量来计算的。
如图所示,对于q来说,我们做另一条平行于原直线的直线,p’ * n’ = d’,显然有q * n = d’
于是两条直线分别为:
p ∗ n = d p * n = d pn=d
p ∗ n = q ∗ n p * n = q * n pn=qn
则其距离为d-q * n,但是我觉得是不是少除了个n的模长,这里的n应该是单位向量才正确!
然后交点就为
q’ = q + (d - q * n)n
如果n不是单位向量的话,那么距离应该等于
d − q ∗ n ∣ n ∣ \frac{d-q * n}{|n|} ndqn

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=qporg,则 v ∗ d = t d v * d = td vd=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(qporg))d

3.平面上最近的点

平面和直线的表达式其实是一样的,也是
p ∗ n = d p * n =d pn=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=dddr
然后有q’ = q+b
q ′ = q + d ∗ ∣ d ∣ − r ∣ d ∣ q' = q + d * \frac{|d|-r}{|d|} q=q+dddr

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值