3D数学 学习笔记(11) 几何检测
参考书籍:
《3D数学基础:图形与游戏开发》
隐式直线上的最近点
任意点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。