中EN
概念页

包围体重叠测试

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 节)

点代入平面方程 n⋅x+d\mathbf{n}\cdot\mathbf{x}+d 得有符号距离;平面-球只需看球心距离绝对值是否不超过半径。盒子不必代入 8 个角:沿平面法线方向相距最远的是某条对角线的两个端点,只测这两个角即可。

AABB:中心 c=(bmax+bmin)/2\mathbf{c}=(\mathbf{b}^{max}+\mathbf{b}^{min})/2,正半对角线 h=(bmax−bmin)/2\mathbf{h}=(\mathbf{b}^{max}-\mathbf{b}^{min})/2,盒在法线上的投影"范围"

e=hx∣nx∣+hy∣ny∣+hz∣nz∣e=h_x|n_x|+h_y|n_y|+h_z|n_z|

(8 条半对角线 (±hx,±hy,±hz)(\pm h_x,\pm h_y,\pm h_z) 与 n\mathbf{n} 的点积在各项都为正时最大)。s=c⋅n+ds=\mathbf{c}\cdot\mathbf{n}+d;以正半空间为外侧,s−e>0s-e>0 完全在外,s+e<0s+e<0 完全在内,否则相交。

OBB:只需改范围为 e=hu∣n⋅bu∣+hv∣n⋅bv∣+hw∣n⋅bw∣e=h_u|\mathbf{n}\cdot\mathbf{b}^u|+h_v|\mathbf{n}\cdot\mathbf{b}^v|+h_w|\mathbf{n}\cdot\mathbf{b}^w|。

三角形-三角形(22.11 节)

先测 T1T_1 是否与 T2T_2 所在平面 π2\pi_2 相交,反之亦然,任一失败则不相交。不共面时两平面交于直线 LL,两三角形相交当且仅当它们在 LL 上的区间重叠。Guigue 与 Devillers 大量使用 4×4 行列式

[a,b,c,d]=(d−a)⋅((b−a)×(c−a))[\mathbf{a},\mathbf{b},\mathbf{c},\mathbf{d}]=(\mathbf{d}-\mathbf{a})\cdot\big((\mathbf{b}-\mathbf{a})\times(\mathbf{c}-\mathbf{a})\big)

其符号表示 d\mathbf{d} 位于三角形 △abc\triangle abc 平面的哪一侧,也可理解为沿 b−a\mathbf{b}-\mathbf{a} 方向的"螺旋"是否与 d−c\mathbf{d}-\mathbf{c} 同向。

  1. 计算 [q1,q2,q3,pi][\mathbf{q}_1,\mathbf{q}_2,\mathbf{q}_3,\mathbf{p}_i](i=1,2,3i=1,2,3):符号相同且非零则不相交;全为零则共面,转二维处理;对 T2T_2 同样测试。
  2. 重排各三角形顶点,使第一个顶点单独位于另一平面的一侧,得到区间 I1=[i,j]I_1=[i,j]、I2=[k,l]I_2=[k,l],重叠当且仅当 k≤jk\le j 且 i≤li\le l。用螺旋测试表达,最终条件为
[p1,p2,q1,q2]≤0  且  [p1,p3,q3,q1]≤0[\mathbf{p}_1,\mathbf{p}_2,\mathbf{q}_1,\mathbf{q}_2]\le0 \;\text{且}\; [\mathbf{p}_1,\mathbf{p}_3,\mathbf{q}_3,\mathbf{q}_1]\le0

前三个行列式共享参数,2×2 子行列式可在多个 4×4 行列式之间复用。共面情形:投影到面积最大的坐标平面,先测所有闭合边是否相交,再用点在三角形内测试判断是否一个包含另一个。SAT 也能推导此测试,但该方法更快;精度问题可用精确算术避免。

三角形-AABB(22.12 节)

Akenine-Möller 基于 SAT 的方法,用于体素化和碰撞检测。把盒和三角形平移使盒心在原点(vi=ui−c\mathbf{v}_i=\mathbf{u}_i-\mathbf{c};OBB 先用逆变换旋转三角形),测试 13 条轴,找到分离轴立即返回不重叠:

  1. 3 条盒法线:等价于盒与三角形最小 AABB 的比较。
  2. 1 条三角形法线:用上面的平面-AABB 测试。
  3. 9 条 aij=ei×fj\mathbf{a}_{ij}=\mathbf{e}_i\times\mathbf{f}_j,fj\mathbf{f}_j 为三角形边向量。

以 a00=e0×f0=(0,−f0z,f0y)\mathbf{a}_{00}=\mathbf{e}_0\times\mathbf{f}_0=(0,-f_{0z},f_{0y}) 为例,三角形三顶点投影中 p0=p1p_0=p_1,只需比较 p0p_0 与 p2p_2(条件语句在现代 CPU 上昂贵,少一次比较很划算);盒投影半径 r=hy∣ay∣+hz∣az∣r=h_y|a_y|+h_z|a_z|(此轴 ax=0a_x=0);若 min⁡(p0,p2)>r\min(p_0,p_2)>r 或 max⁡(p0,p2)<−r\max(p_0,p_2)<-r 则分离。

包围体之间(22.13 节)

测试方法备注
球-球圆心距与半径和比较,都用平方免开方可用 SSE 一次测 4 对
球-AABB(Arvo)逐轴把球心坐标与盒范围比较,在外则累加该轴距离的平方,总和与 r2r^2 比较可扩展到空心盒/球和轴对齐椭球
球-AABB(Larsson 等 QRI 版)逐轴若某轴距离已大于 rr 立即返回分离重叠概率低时明显更快
球-AABB(SSE 版)ei=max⁡(aimin−ci,0)+max⁡(ci−aimax,0)e_i=\max(a_i^{min}-c_i,0)+\max(c_i-a_i^{max},0) 三轴并行,e⋅e>r2\mathbf{e}\cdot\mathbf{e}>r^2 即分离无分支、无早退但最快
球-OBB把球心变换到 OBB 坐标系后按 AABB 处理椭球-OBB 可先缩放成球与平行六面体
AABB-AABB任一轴上 aimin>bimaxa_i^{min}>b_i^{max} 或 bimin>aimaxb_i^{min}>a_i^{max} 即分离常用于碰撞检测和场景图节点
k-DOP-k-DOPk/2k/2 次一维区间重叠测试;省略边叉积轴,因此保守但不精确中等 k 下比 OBB 测试快一个数量级;平移后把平移向量在各法线上的投影加到 dd 上;每个实例只需存 k 个标量
OBB-OBB在 A 的坐标系中,B 以平移 t\mathbf{t} 和旋转 R\mathbf{R} 表示;SAT 测 15 条轴:A 的 3 个面、B 的 3 个面、3×33\times3 个边叉积 ai×bj\mathbf{a}^i\times\mathbf{b}^j比基于最近特征或线性规划的方法快约一个数量级

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 端点排序,借助帧间相干性把排序降到期望 O(n)O(n)(卷 II 14.3.6.3)。详见 碰撞检测系统。
  1. realtime_rendering_4ed.pdf 第 22 章 Intersection Test Methods
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.3.5–14.3.6 节

相关页面

游戏数学相交测试基础与分离轴Intersection Test Fundamentals & Separating Axis相交测试判断两个对象是否相交(包含、边界相交或分离),有时还需要最近交点或穿透深度与方向,是碰撞检测、视锥剔除、拾取和光线追踪的基础。本页汇总 RTR4 第 22 章的通用工具:光线与曲面的表示、常见包围体定义(AABB、OBB、k-DOP、凸多面体、胶囊与菱形体)、分离轴测试 (SAT)、几何概率与表面积启发式 (SAH)、设计相交例程的经验法则,以及基于 GPU 的拾取。游戏数学包围体构建Bounding Volume Construction紧凑的包围体能降低相交测试成本:光线击中凸体的概率与其表面积成正比,拒绝永远不比相交慢,所以求交加速应最小化 BV 表面积;碰撞检测则常最小化体积。本页讲 AABB/k-DOP、包围球(AABB 法、Ritter 近似法、Welzl 最优法)、凸包(Quickhull)以及 OBB(PCA 法、数值最小化、Larsson 与 Källberg 的近优线性算法)的构建方法与取舍。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。游戏数学视锥相交测试View Frustum Intersection Tests层次视锥剔除遍历 BVH 时最频繁调用的就是视锥与包围体的测试,理想结果分三态:完全在外(剪掉子树)、完全在内(子树免测)、相交(递归)。本页讲从组合矩阵直接提取六个视锥平面、把"BV 对视锥"转化为"点对扩张/收缩体积"的推导思路,以及视锥-球、视锥-盒的高效保守测试及其误报情况。图形学体素Voxels体素是"体积元素",表示均匀三维网格中的一块空间,位置由网格索引隐含。体素是存储体积数据的传统方式,可存占用位、密度、颜色、法线、有向距离等。数据量按分辨率立方增长,常用稀疏体素八叉树 (SVO) 等结构压缩;可由 GPU 体素化生成,并通过光线投射、转多边形、移动立方体或等值面/水平集光线追踪来渲染(RTR4 13.10 节)。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。图形学硬件光栅化与透视校正插值Hardware Rasterization & Perspective-Correct InterpolationGPU 光栅化由三角形设置与三角形遍历组成。硬件用每条边一个边函数判断采样点是否在三角形内,利用其增量性质按瓦片分层遍历,用左上规则决定恰好落在边上的像素归属,用保护带避免大多数裁剪。边函数的值恰好是子三角形面积的两倍,因此遍历顺带得到重心坐标;透视投影下需要线性插值 a/w 与 1/w 再逐像素相除,得到透视校正插值。本页还介绍 2×2 quad 与辅助像素、保守光栅化。游戏开发 · UE5Chaos 物理与碰撞Chaos Physics & CollisionChaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。游戏数学点与向量运算Points & Vector Operations游戏程序员最常用的数学是三维向量与矩阵(三维线性代数)。本页按 GEA 第 5 章整理点与向量的基础:坐标系与手性、点与方向的区别、标量乘与 Hadamard 积、加减、模长与归一化、点积与投影、叉积、伪向量与外代数,以及线性插值 (lerp)。贯穿全章的两条经验是:能在二维里想清楚的问题先在二维里想,以及能不开方就不开方。游戏数学几何图元的表示Geometric Primitive Representations除点、向量、矩阵、四元数外,游戏引擎还天天用到直线/射线/线段、球、平面、AABB、OBB、视锥和凸多面体区域。本页按 GEA 整理它们在内存中如何表示以及最基本的「点在内部吗」测试;各种求交与重叠算法见 RTR4 来源的相交测试系列页面。游戏开发碰撞检测系统Collision Detection System碰撞检测系统判断游戏世界里的物体是否接触,本质上是一个"高级几何相交测试器",同时返回接触的详细信息。每个可碰撞对象由形状 + 变换描述,全部存放在独立的碰撞世界里;形状尽量用球、胶囊、盒、凸体等简单图元。为了在大量物体中快速找到真正相交的对,引擎使用时间相干性、空间划分,以及宽相、中相、窄相三级筛选(GEA4 卷 II 14.3)。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原