zhouqijie

一、直线、线段、射线

直线Line:

一条直线可表示为直线上一点即沿着直线的单位矢量。
参数方程:$P(t) = P_0 + tu$

射线Ray:

射线可表示为直线参数方程P(t)加上约束t>=0。

线段Line Segment:

线段受限于两个端点。
参数方程:$P(t) = P_0 + tu$ (其中0 <= t <= L)
或者:$P(t) = P_0 + tL$ (其中0 <= t <= 1)

二、球体Sphere

球体通常定义为中心点C加上半径r。

用一个四维向量$[C_x \space C_y \space C_z \space r]$表示,在SIMD处理中有显著好处。

三、平面Plane

所以平面和球体一样也可以表示为四维向量$[n \space d] = [a \space b \space c \space d]$。
四维向量形式的平面很容易从一个坐标系变化到另一个坐标系。需要使用逆转置矩阵来转换。

P点满足坐标关系式:dot(n,P) = -d
P点齐次坐标满足关系式:dot(plane, P) = 0

四、轴对齐包围盒AABB

轴对齐包围盒(Axis-Aligned Bounding Box)是三维长方体,六个面都与正交轴对齐。

所以AABB可以用六维向量$[x_{min} \space x_{max} \space y_{min} \space y_{max} \space z_{min} \space z_{max}]$表示。或者也可以用两个点$P_{min}$和$P_{max}$表示。

检测一点P是非在给定AABB之内只需要判断:

$P_x >= x_{min} 及 P_x <= x_{max}$及
$P_y >= y_{min} 及 P_y <= y_{max}$及
$P_z >= z_{min} 及 P_z <= z_{max}$

AABB的交集检测非常高效,常作为碰撞检测的早期淘汰测试。如果两个AABB不相交则不再做进一步的检测。

*五、定向包围盒OBB

定向包围盒(Oriented Bounding Box)与AABB的区别是不与世界坐标轴对齐,而是按照某种逻辑方式对齐,通常和局部坐标轴对齐。进行相交测试前需要先进行变换。

六、平截头体Frustum

平截头体常见于三维渲染中的透视投影,三维世界的可视范围就是一个平截头体。平截头体的上下左右四面代表屏幕四边,前后两面是远/近剪切面。

内外检测:
通过点积计算该点是否在6各平面之内。

技巧:
把要测试的世界空间点通过透视投影变换到齐次裁剪空间。世界空间的平截头体在齐次裁剪空间变为AABB,然后就可以更简单地进行内外测试。

七、凸多面体区域Convex

凸多面体区域(Convex Polyhedral Region)的内外检测很简单直接,和Frustum一样只不过面可能更多。

凸多面体适合做任意形状的触发区域。