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。



本文档详细介绍了3D数学中的几何检测方法,包括如何寻找最短距离、相交性和碰撞检测等关键主题。覆盖直线、射线、平面、球体及AABB等基本元素之间的交互。
628

被折叠的 条评论
为什么被折叠?



