概念页
包围体构建
Bounding Volume Construction
紧凑的包围体能降低相交测试成本:光线击中凸体的概率与其表面积成正比,拒绝永远不比相交慢,所以求交加速应最小化 BV 表面积;碰撞检测则常最小化体积。本页讲 AABB/k-DOP、包围球(AABB 法、Ritter 近似法、Welzl 最优法)、凸包(Quickhull)以及 OBB(PCA 法、数值最小化、Larsson 与 Källberg 的近优线性算法)的构建方法与取舍。
AABB 与 k-DOP(22.3.1 节)
- AABB:沿每条轴取顶点的最小与最大值。
- k-DOP:把顶点投影到每条法线 ,最小、最大投影值即 、,定义该方向最紧的平板;全部平板即最小 k-DOP。k 增大时 k-DOP 越来越接近凸包。
包围球(22.3.2 节)
| 方法 | 做法 | 特点 |
|---|---|---|
| AABB 外接球 | 用 AABB 中心和对角线 | 常数时间、单遍,有时很松 |
| AABB 中心 + 最远点 | 以 AABB 中心为球心,再遍历一遍找最远顶点(比较平方距离免开方)作半径 | 通常更紧 |
| Ritter | 找 x、y、z 轴上各自最小与最大的顶点,取三对中距离最大的一对,以中点为球心、半距为半径;再遍历所有顶点,若距离 ,球心向该点移动 ,半径设为 | 近优,遍历后保证包含所有顶点 |
| Welzl | 维护定义球的支撑点集(球面上 2~4 个点);顶点在外时加入支撑集(可能移除旧点)、重算球并重新遍历,直到包含全部顶点 | 保证最优,但更复杂;随机顺序下期望线性,但比 Ritter 慢约一个数量级 |
嵌套子球时:子球半径相同则把球心当顶点处理,最后加上子半径;半径不同时在计算 AABB 和距离时把各自半径算进去。简化版 Ritter 只比基础版贵约 20%,但有时结果更差,两者都跑一遍取更好者是值得的。
凸多面体(22.3.3 节)
凸物体可用于分离轴测试。用任意平面集"收缩包裹"物体得到凸包,可削去更多体积,从而避免对内部网格做更昂贵的测试。Quickhull 等算法虽名为 quick,实际慢于线性时间,复杂模型通常离线预处理。凸包可能平面很多,可先生成简化(并可能向外扩张以完全包住原物体)的网格,得到精度较低但更简单的凸包。
OBB(22.3.4 节)
物体可能有"天然" OBB(AABB 经旋转得到),但未必最优:例如斜伸出建筑的旗杆,沿杆方向的 OBB 比 AABB 紧得多。没有明显最佳轴的模型,构建 OBB 比构建好的包围球更难。
- O'Rourke(1985)精确解:。
- Gottschalk:先求凸包(避免内部顶点影响结果),再用线性时间的主成分分析 (PCA) 求轴;缺点是有时较松。
- Eberly:采样若干方向作为起点,用 Powell 方向集法数值最小化体积。还有用遗传算法搜索的方法。
- Larsson 与 Källberg 近优法:不需要凸包、线性时间,质量通常优于 PCA、更快、适合 SIMD。
flowchart TD A["构建 k-DOP, 每个平板取一对触边顶点作为极值点"] --> B["最佳 OBB 初始化为 AABB"] B --> C["距离最远的一对极值点构成基三角形一边, 离该边最远的极值点为第三点"] C --> D["对三角形每条边: 边与面内法线定二轴, 投影极值点得二维矩形, 取最小者"] D --> E["沿三角形法线投影得高度, 生成完整 OBB 与 AABB 比较"] E --> F["高度最高与最低的两个极值点各与基三角形构成四面体, 新增 6 个三角形重复评估"] F --> G["共 7 个三角形中最佳 OBB, 用所有顶点扩展并再与 AABB 比较"]
如上图,26-DOP 会产生 13 对极值点(可能重复)。由于同一三角形的三个候选 OBB 高度相同,只需比较二维包围矩形即可选出最好的一个。作者倾向于按表面积而非体积优化,原因见几何概率(相交测试基础与分离轴)。
PBRT 的视角:AABB 的实现细节(PBRT 4e 3.7)
- 表示:pbrt 的
Bounds2/Bounds3存最小角pMin和最大角pMax两个点(另一种是"一个角 + 三个边长");图像分块并行用 2D 整数包围盒,BVH 用 3D 浮点包围盒。 - 空盒:默认构造把
pMin设为最大可表示数、pMax设为最小可表示数,故意违反pMin <= pMax,这样与空盒做Union()自然得到正确结果。 - 坑:
Union()要直接给结果的pMin/pMax赋值,不能把Min()/Max()的结果传给"两个角点"构造函数:构造函数会对坐标排序,把两个空盒的并集变成近乎无穷大的盒。 - 常用操作:交集取两盒
pMin的最大值和pMax的最小值;重叠测试即三条轴上的区间都重叠;Inside()与不含上边界的InsideExclusive()(适合整数盒);点到盒的平方距离逐轴取 再平方求和;Corner(i)用 的低三位选角;Offset()是Lerp()的逆;MaxDimension()给出最长轴,供加速结构选分割轴。 - 包围球:
BoundingSphere()给出包住盒子的球,比直接包住原几何的球(上文 Ritter/Welzl 方法)松得多,但某些运算用球更方便,例如 球面几何与方向参数化 中的方向锥。 - "空"指体积为零,不一定表面积为零。
出处
- realtime_rendering_4ed.pdf 第 22 章 Intersection Test Methods
- PBRT 4e source excerpt: chapter 03 (Geometry and Transformations)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 3 章 3.7 节,pbr-book.org/4ed/Geometry_and_Transformations
相关页面
游戏数学相交测试基础与分离轴Intersection Test Fundamentals & Separating Axis相交测试判断两个对象是否相交(包含、边界相交或分离),有时还需要最近交点或穿透深度与方向,是碰撞检测、视锥剔除、拾取和光线追踪的基础。本页汇总 RTR4 第 22 章的通用工具:光线与曲面的表示、常见包围体定义(AABB、OBB、k-DOP、凸多面体、胶囊与菱形体)、分离轴测试 (SAT)、几何概率与表面积启发式 (SAH)、设计相交例程的经验法则,以及基于 GPU 的拾取。游戏数学包围体重叠测试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)空体积更少、更紧,代价是测试更贵。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。图形学网格简化Mesh Simplification网格简化(数据缩减、抽取 decimation)在尽量保持外观的前提下减少三角形数,使应用能在低端机器上伸缩。核心操作是可逆的边折叠,用代价函数(典型是 Garland–Heckbert 的二次误差度量 QEM)排序;它产生的渐进网格可用于连续 LOD 与渐进传输,但自动化并非万能。游戏数学直线与平面求交Line & Plane Intersections本页收录 RTR4 第 22.15~22.16 节的基础几何工具:二维直线/光线/线段求交(垂直点积法与无除法的早期拒绝法)、三维直线求交与异面直线最近点,以及三个平面的交点公式(可用于求 k-DOP 等平面围成凸体的角点)。这些在游戏中常用于射线检测、二维几何、碰撞与包围体构建。游戏开发 · UE5Chaos 物理与碰撞Chaos Physics & CollisionChaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。游戏数学几何图元的表示Geometric Primitive Representations除点、向量、矩阵、四元数外,游戏引擎还天天用到直线/射线/线段、球、平面、AABB、OBB、视锥和凸多面体区域。本页按 GEA 整理它们在内存中如何表示以及最基本的「点在内部吗」测试;各种求交与重叠算法见 RTR4 来源的相交测试系列页面。游戏开发碰撞检测系统Collision Detection System碰撞检测系统判断游戏世界里的物体是否接触,本质上是一个"高级几何相交测试器",同时返回接触的详细信息。每个可碰撞对象由形状 + 变换描述,全部存放在独立的碰撞世界里;形状尽量用球、胶囊、盒、凸体等简单图元。为了在大量物体中快速找到真正相交的对,引擎使用时间相干性、空间划分,以及宽相、中相、窄相三级筛选(GEA4 卷 II 14.3)。游戏数学球面几何与方向参数化Spherical Geometry & Direction Parameterizations渲染中大量计算发生在单位球面上:方向就是球面上的点,一组方向就是球面上的一块区域。本页按 PBRT 4e 3.8 节整理立体角、球面多边形面积、三种球面参数化(球坐标、八面体编码、等面积映射)以及用于剔除光源的方向锥,并附原书一处公式问题。