3D数学 学习笔记(11)几何检测

发表于2018-01-03
评论0 2.1k浏览
几何检测中比较重要的是射线和平面的相交检测,射线和AABB的相交性检测,射线和三角形的相交性检测,射线和球的相交性检测;球和平面的相交性检测,AABB和平面的相交检测,两个AABB间静态和动态的检测。希望可以帮到大家去学习几何检测。

隐式直线上的最近点

任意点q,找到直线 p·n = d 上最近的点q’。

- d - dM = d - q·n


参数射线上的最近点

任意点q,找到射线上p(t) = porg + td 最近点q’。直接点乘做投影即可。 
- t = d·v = d·(q - porg)

如果t是从0到1变化,计算t必须除以d的模: 


平面上的最近点

任意点q,找到平面p·n上最近的点q’。a为距离。 
- p + an =q


圆或球的最近点

任意点q,找到圆 || p - c || = r 上(边缘)最近点q’。


AABB上的最近点

直接在判断xyz即可。 


2D中两条直线的相交性检测

即求解方程组: 

三种情况: 
- 一个解:分母不为0。 
- 无解:分母为0,平行且不相交。 
- 无穷多个解:分母为0,两线重合。

3D中两条射线相交检测

同样解方程组,即 r1(t1) = r2(t2)。 

三种情况: 
- 一个解:分母不为0,即d1、d2叉乘不为0。注意如果两线不在同一平面,求的两个值是相距最近的点。 
- 无解:分母为0,平行。 
- 无穷多个解:分母为0,重合。


射线和平面相交性检测

射线p(t) = po + td , 平面p·n = d。

四种情况: 
- t > l(射线长度):不相交。 
- l ≥ t >0:相交。 
- t = 0:平行。 
- t < 0:射线原点在面的背后,不相交。


AABB和平面相交检测

AABB由pmin和pmax定义。判断和平面p·n = d相交,只需用平面法向量n点乘AABB的最大最小点即可。

三种情况: 
- min >= d:AABB最小值都在平面之上,说明整个AABB都在平面之上(正面),不相交。 
- max <= d:AABB在平面背面,不相交。 
- 其余情况:相交。


三个平面相交性检测

求解方程组即可。p为相交的点。 

三种情况: 
- 相交于一点:分母不为0。 
- 不存在:分母为0,至少两个平面平行且不重叠。 
- 无穷多个:分母为0,至少两个平面重叠。


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

射线p(t) = po + td,d为单位向量,t范围:[0, l]。求的t为交点处的值。 
如果根号内的值为负,则不相交。 

两种情况: 
- 相交:根号值为非负。 
- 不相交:根号值 为负。


两个圆/球相交性检测

静态测试:直接判断两圆心距离即可。即d2 < (r1 + r2)2

动态测试:两个球位移分别为d1和d2。简化问题,看成一个静止,另一个运动:位移为d2 - d1。 

三种情况: 
- ||e|| < r:球在 t = 0时就相交了(运动前两个就相交了)。 
- t < 0 或 t > l:在时间段内不会相交。 
- 根号值为负:两球不相交。


球和AABB的相交性检测

先找到球心里AABB最近的点(见前面),最近点和球心距离d,比较d和球半径即可。


球和平面的相交性检测

静态测试:直接判断球心和平面距离(见前面),加上一个球半径判断即可。

动态测试:球运动轨迹为c + td。c为圆心,d为方向,t从0变化到l。直接使用射线与平面交点公式(见前面)即可,不过要加上球半径r。 

3D数学 学习笔记系列教程:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: