包围体重叠测试
Bounding Volume Overlap Tests
碰撞检测先测试包围体是否重叠,只有重叠时才逐图元测试;最底层则需要三角形之间、三角形与盒之间的精确测试。本页整理 RTR4 第 22.10~22.13 节:平面与 AABB/OBB(只测两个角的"投影半径"法)、三角形-三角形(Guigue-Devillers 行列式法)、三角形-AABB(13 轴 SAT)、球-球、球-盒(Arvo 及其向量化版本)、AABB-AABB、k-DOP-k-DOP 与 OBB-OBB(15 轴 SAT)。更复杂的 BV(OBB、k-DOP)空体积更少、更紧,代价是测试更贵。
平面-盒(22.10 节)
点代入平面方程 得有符号距离;平面-球只需看球心距离绝对值是否不超过半径。盒子不必代入 8 个角:沿平面法线方向相距最远的是某条对角线的两个端点,只测这两个角即可。
AABB:中心 ,正半对角线 ,盒在法线上的投影"范围"
(8 条半对角线 与 的点积在各项都为正时最大)。;以正半空间为外侧, 完全在外, 完全在内,否则相交。
OBB:只需改范围为 。
三角形-三角形(22.11 节)
先测 是否与 所在平面 相交,反之亦然,任一失败则不相交。不共面时两平面交于直线 ,两三角形相交当且仅当它们在 上的区间重叠。Guigue 与 Devillers 大量使用 4×4 行列式
其符号表示 位于三角形 平面的哪一侧,也可理解为沿 方向的"螺旋"是否与 同向。
- 计算 ():符号相同且非零则不相交;全为零则共面,转二维处理;对 同样测试。
- 重排各三角形顶点,使第一个顶点单独位于另一平面的一侧,得到区间 、,重叠当且仅当 且 。用螺旋测试表达,最终条件为
前三个行列式共享参数,2×2 子行列式可在多个 4×4 行列式之间复用。共面情形:投影到面积最大的坐标平面,先测所有闭合边是否相交,再用点在三角形内测试判断是否一个包含另一个。SAT 也能推导此测试,但该方法更快;精度问题可用精确算术避免。
三角形-AABB(22.12 节)
Akenine-Möller 基于 SAT 的方法,用于体素化和碰撞检测。把盒和三角形平移使盒心在原点(;OBB 先用逆变换旋转三角形),测试 13 条轴,找到分离轴立即返回不重叠:
- 3 条盒法线:等价于盒与三角形最小 AABB 的比较。
- 1 条三角形法线:用上面的平面-AABB 测试。
- 9 条 , 为三角形边向量。
以 为例,三角形三顶点投影中 ,只需比较 与 (条件语句在现代 CPU 上昂贵,少一次比较很划算);盒投影半径 (此轴 );若 或 则分离。
包围体之间(22.13 节)
| 测试 | 方法 | 备注 |
|---|---|---|
| 球-球 | 圆心距与半径和比较,都用平方免开方 | 可用 SSE 一次测 4 对 |
| 球-AABB(Arvo) | 逐轴把球心坐标与盒范围比较,在外则累加该轴距离的平方,总和与 比较 | 可扩展到空心盒/球和轴对齐椭球 |
| 球-AABB(Larsson 等 QRI 版) | 逐轴若某轴距离已大于 立即返回分离 | 重叠概率低时明显更快 |
| 球-AABB(SSE 版) | 三轴并行, 即分离 | 无分支、无早退但最快 |
| 球-OBB | 把球心变换到 OBB 坐标系后按 AABB 处理 | 椭球-OBB 可先缩放成球与平行六面体 |
| AABB-AABB | 任一轴上 或 即分离 | 常用于碰撞检测和场景图节点 |
| k-DOP-k-DOP | 次一维区间重叠测试;省略边叉积轴,因此保守但不精确 | 中等 k 下比 OBB 测试快一个数量级;平移后把平移向量在各法线上的投影加到 上;每个实例只需存 k 个标量 |
| OBB-OBB | 在 A 的坐标系中,B 以平移 和旋转 表示;SAT 测 15 条轴:A 的 3 个面、B 的 3 个面、 个边叉积 | 比基于最近特征或线性规划的方法快约一个数量级 |
apex point map(Laine 与 Karras):把一组平面法线映射到 k-DOP 上沿该方向最远的点,该点与方向形成包住模型的平面;可用于更精确的 k-DOP 相交、改进视锥剔除、旋转后求更紧的 AABB。胶囊和菱形体能快速计算最小距离,常用于验证两物体至少相距某个距离的公差检查。也可用圆柱、椭球或多个球作为包围体。
flowchart TD
A["两个物体"] --> B{"包围体重叠?"}
B -- "否" --> C["不碰撞, 最常见情形"]
B -- "是" --> D["层次中更细的 BV"]
D --> E["三角形-三角形 / 三角形-盒 精确测试"]如上图,包围体测试的目的是用便宜的测试高效拒绝最常见的不碰撞情形。
GEA 的视角:碰撞引擎里的球与 AABB 测试(卷 II 14.3.5.1–14.3.5.4、14.3.6.3)
- 球-球:比较球心距离的平方与半径和的平方,避免开方(卷 II 14.3.5.2)。
- AABB-AABB:由分离轴定理,候选分离轴只有三条坐标轴,三条轴上的区间都重叠才相交(卷 II 14.3.5.4)。这与本页"包围体之间"一节一致。
- 在管线中的位置:GEA 指出,这类廉价测试主要用于宽相(粗略 AABB 筛出可能相交的对)和中相(复合形状的包围体层次);窄相再测具体图元。宽相常用扫描剪除:沿三条主轴对 AABB 端点排序,借助帧间相干性把排序降到期望 (卷 II 14.3.6.3)。详见 碰撞检测系统。
出处
- realtime_rendering_4ed.pdf 第 22 章 Intersection Test Methods
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.3.5–14.3.6 节