中EN
概念页

几何图元的表示

Geometric Primitive Representations

更新于 2026-10-12 约 8 分钟几何直线射线线段球平面AABBOBB

除点、向量、矩阵、四元数外,游戏引擎还天天用到直线/射线/线段、球、平面、AABB、OBB、视锥和凸多面体区域。本页按 GEA 整理它们在内存中如何表示以及最基本的「点在内部吗」测试;各种求交与重叠算法见 RTR4 来源的相交测试系列页面。

直线、射线与线段(卷 I 5.6.1)

  • 直线:点 P0\mathbf{P}_0 加单位方向 u\mathbf{u},参数方程 P(t)=P0+tu, −∞<t<∞\mathbf{P}(t)=\mathbf{P}_0+t\mathbf{u},\ -\infty<t<\infty。(原文此处正文把方向写作 v\mathbf{v}、公式写作 u\mathbf{u},应为笔误,本页统一用 u\mathbf{u}。)
  • 射线:同一方程加约束 t≥0t\ge0。
  • 线段:两端 P0\mathbf{P}_0、P1\mathbf{P}_1,令 L=P1−P0\mathbf{L}=\mathbf{P}_1-\mathbf{P}_0、L=∣L∣L=|\mathbf{L}|、u=L/L\mathbf{u}=\mathbf{L}/L,有两种写法:
    1. P(t)=P0+tu, 0≤t≤L\mathbf{P}(t)=\mathbf{P}_0+t\mathbf{u},\ 0\le t\le L;
    2. P(t)=P0+tL, 0≤t≤1\mathbf{P}(t)=\mathbf{P}_0+t\mathbf{L},\ 0\le t\le1。
  • 第 2 种更方便:参数归一化到 [0, 1],不必另存长度 LL——它已编码在必须存储的 L=Lu\mathbf{L}=L\mathbf{u} 中。

球(卷 I 5.6.2)

中心 C\mathbf{C} 加半径 rr,正好装进一个四元素向量 [Cx Cy Cz r][C_x\ C_y\ C_z\ r]。能把数据打包成 4 个 32 位浮点(128 位)对 SIMD 有明显好处(见 SIMD 向量化)。球-球相交测试见 点与向量运算。

平面(卷 I 5.6.3)

  • 传统方程 Ax+By+Cz+D=0Ax+By+Cz+D=0;也可用点法式 (point-normal form):面上一点 P0\mathbf{P}_0 加单位法线 n\mathbf{n}。
  • [A B C][A\ B\ C] 就是法线方向。归一化后 [a b c]=n[a\ b\ c]=\mathbf{n},d=D/A2+B2+C2d=D/\sqrt{A^2+B^2+C^2} 是平面到原点的距离:法线指向原点(原点在平面「正面」)时 dd 为正,背离原点时为负。
  • 两种形式是同一个方程:点 P\mathbf{P} 在平面上当且仅当 n⋅P=n⋅P0\mathbf{n}\cdot\mathbf{P}=\mathbf{n}\cdot\mathbf{P}_0,即 ax+by+cz+d=0ax+by+cz+d=0,其中 d=−n⋅P0d=-\mathbf{n}\cdot\mathbf{P}_0。
  • 点不在平面上时,左边给出点到平面的垂直有向距离:h=(P−P0)⋅n=ax+by+cz+dh=(\mathbf{P}-\mathbf{P}_0)\cdot\mathbf{n}=ax+by+cz+d,与 点与向量运算 中用点积求高度是同一公式。
  • 四元素存储:L=[n d]=[a b c d]\mathbf{L}=[\mathbf{n}\ d]=[a\ b\ c\ d]。点写成 w=1w=1 的齐次坐标时,L⋅P=0\mathbf{L}\cdot\mathbf{P}=0 是 n⋅P=−d\mathbf{n}\cdot\mathbf{P}=-d 的又一种写法。
  • 变换平面:若 MA→B\mathbf{M}_{A\to B} 变换点和普通向量,则对四元素平面向量 L\mathbf{L} 施加逆转置 (MA→B−1)T(\mathbf{M}_{A\to B}^{-1})^T 即可把平面从 A 变到 B,与法线变换同理(见 基本仿射变换)。GEA 未证明,推导参见 Lengyel 书 4.2.3 节。

轴对齐包围盒 AABB(卷 I 5.6.4)

  • 六个面与某坐标系的轴对齐的长方体,用六元素向量 [xmin,ymin,zmin,xmax,ymax,zmax][x_{min},y_{min},z_{min},x_{max},y_{max},z_{max}] 或两个点 Pmin\mathbf{P}_{min}、Pmax\mathbf{P}_{max} 表示。
  • 点在内部:xmin≤Px≤xmaxx_{min}\le P_x\le x_{max} 且 y、z 同理,六个比较全部成立。
  • 因为测试极快,AABB 常作碰撞检测的 early out:两物体 AABB 不相交,就不必做更精细、更贵的测试。构建方法见 包围体构建,盒-盒等重叠测试见 包围体重叠测试。

有向包围盒 OBB(卷 I 5.6.5)

按物体某种逻辑方向(通常是局部空间轴)摆放的长方体,在局部空间里就是 AABB,在世界中不一定轴对齐。常用的点内测试:把点变换到 OBB 的对齐坐标系,再做 AABB 测试。

视锥(卷 I 5.6.6)

  • 六个平面围成的平截头体:四个对应屏幕边缘,另两个是近、远裁剪面(可见点的最小和最大 z)。是透视投影下虚拟相机的可见区域。
  • 常用表示:六个点法式平面的数组。
  • 点在内部:用点积判断点在每个平面的哪一侧,六个都在内侧即在视锥内。
  • 技巧:用相机透视投影把世界空间点变换到齐次裁剪空间,那里视锥只是一个轴对齐长方体(AABB),内外测试简单得多。
  • 原书问题:严格说,齐次裁剪空间里视锥并不是固定的 AABB,内外测试是 −wc≤xc≤wc-w_c\le x_c\le w_c 等与各点自身 wcw_c 比较的不等式(这样的测试依然很简单);只有做完透视除法、到了归一化设备坐标 (NDC) 之后,视锥才变成固定的轴对齐长方体(如 OpenGL 的 [−1,1]3[-1,1]^3,D3D 的 z 取 [0,1][0,1])。来源:Khronos OpenGL Wiki「Vertex Post-Processing」、Wikipedia「Clip coordinates」条目。
  • 更完整的视锥-球、视锥-盒测试见 视锥相交测试,裁剪空间见 坐标空间。

凸多面体区域(卷 I 5.6.7)

任意一组法线都朝内(或都朝外)的平面围成的区域,点内测试与视锥类似,只是平面可能更多。适合实现任意形状的触发区域;许多引擎这样做,例如 Quake 引擎无处不在的 brush 就是由平面围成的体积。

表示方式小结

图元典型存储点内测试
射线/线段P0\mathbf{P}_0 + u\mathbf{u} 或 L\mathbf{L}—
球[C r][C\ r],4 floatsGEA 未单列
平面[n d][\mathbf{n}\ d],4 floatsL⋅P\mathbf{L}\cdot\mathbf{P} 的符号判断正反面
AABBPmin,Pmax\mathbf{P}_{min},\mathbf{P}_{max},6 floats六个比较
OBB局部坐标系中的 AABB(GEA 未给具体存储格式)变到局部后做 AABB 测试
视锥 / 凸区域平面数组所有平面内侧;视锥可先变到裁剪空间

GEA 第 14 章的补充:作为碰撞图元(卷 II 14.3.4)

卷 I 5.6 讲这些图元怎么表示,卷 II 14.3.4 讲碰撞引擎为什么选它们:

  • 球:中心 + 半径,正好放进一个四分量浮点向量,适合 SIMD,是最高效的碰撞图元。
  • 胶囊:两点 + 半径,比圆柱和盒更快,常用于人体四肢。可以看作扫掠球,但静态胶囊与随时间扫出胶囊的球并不完全等价。
  • AABB:AABB 之间的相交测试极快,但物体旋转后要重算,离轴旋转时贴合很差。
  • OBB:用三个半边长加一个变换表示,贴合任意朝向的物体,表示仍然简单。
  • DOP(离散有向多面体):AABB 和 OBB 都是 6-DOP;常从 OBB 出发用 45° 平面切掉 8 个角,得到 14-DOP。
  • 任意凸体:美术建模,离线工具检验凸性后转换为 k 个平面方程,可以用 GJK。
  • 本页未涉及的多边形汤和复合形状,以及 GEA 对 poly soup "有没有内部"的讨论,见 碰撞检测系统。
  1. Game_Engine_Architecture_4Ed_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 I 第 5 章 5.6 节
  3. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  4. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.3.4 节

相关页面

游戏数学点与向量运算Points & Vector Operations游戏程序员最常用的数学是三维向量与矩阵(三维线性代数)。本页按 GEA 第 5 章整理点与向量的基础:坐标系与手性、点与方向的区别、标量乘与 Hadamard 积、加减、模长与归一化、点积与投影、叉积、伪向量与外代数,以及线性插值 (lerp)。贯穿全章的两条经验是:能在二维里想清楚的问题先在二维里想,以及能不开方就不开方。游戏数学直线与平面求交Line & Plane Intersections本页收录 RTR4 第 22.15~22.16 节的基础几何工具:二维直线/光线/线段求交(垂直点积法与无除法的早期拒绝法)、三维直线求交与异面直线最近点,以及三个平面的交点公式(可用于求 k-DOP 等平面围成凸体的角点)。这些在游戏中常用于射线检测、二维几何、碰撞与包围体构建。游戏数学包围体构建Bounding Volume Construction紧凑的包围体能降低相交测试成本:光线击中凸体的概率与其表面积成正比,拒绝永远不比相交慢,所以求交加速应最小化 BV 表面积;碰撞检测则常最小化体积。本页讲 AABB/k-DOP、包围球(AABB 法、Ritter 近似法、Welzl 最优法)、凸包(Quickhull)以及 OBB(PCA 法、数值最小化、Larsson 与 Källberg 的近优线性算法)的构建方法与取舍。游戏数学包围体重叠测试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)空体积更少、更紧,代价是测试更贵。游戏数学视锥相交测试View Frustum Intersection Tests层次视锥剔除遍历 BVH 时最频繁调用的就是视锥与包围体的测试,理想结果分三态:完全在外(剪掉子树)、完全在内(子树免测)、相交(递归)。本页讲从组合矩阵直接提取六个视锥平面、把"BV 对视锥"转化为"点对扩张/收缩体积"的推导思路,以及视锥-球、视锥-盒的高效保守测试及其误报情况。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。游戏数学相交测试基础与分离轴Intersection Test Fundamentals & Separating Axis相交测试判断两个对象是否相交(包含、边界相交或分离),有时还需要最近交点或穿透深度与方向,是碰撞检测、视锥剔除、拾取和光线追踪的基础。本页汇总 RTR4 第 22 章的通用工具:光线与曲面的表示、常见包围体定义(AABB、OBB、k-DOP、凸多面体、胶囊与菱形体)、分离轴测试 (SAT)、几何概率与表面积启发式 (SAH)、设计相交例程的经验法则,以及基于 GPU 的拾取。游戏开发SIMD 向量化SIMD VectorizationSIMD(单指令多数据)用一条机器指令并行处理多个数据。x86 上从 MMX 发展到 SSE(128 位,4 个 float)、AVX(256 位,8 个)和 AVX-512(512 位,16 个)。GEA 用 SSE 内建函数演示:数组相加、点积、向量×矩阵、矩阵×矩阵,强调两点——避免寄存器内的水平相加(先转置数据),以及把 SIMD 寄存器看成 N 条并行的「通道 (lane)」而不只是一个 4D 向量;条件分支则用向量谓词化 (vector predication / select) 代替。游戏数学基本仿射变换Basic Affine Transforms平移、旋转、缩放、切变是摆放和变形物体的基础矩阵;它们的连乘顺序有关、但满足结合律。刚体变换的逆可以直接写出,法线要用伴随矩阵的转置(传统说法是逆转置)变换。理解这些矩阵的性质能写出更快、更正确的变换代码。图形学剔除技术Culling Techniques剔除 (culling) 是在渲染前尽快去掉对最终图像没有贡献的部分。本页讲几何类剔除:背面剔除(含成簇背面剔除与法线锥)、视锥剔除(层次化、平面掩码)、室内场景的入口剔除,以及牺牲质量换速度的细节剔除和小三角形剔除。更复杂的遮挡剔除见 遮挡剔除。图形学参数曲面与贝塞尔面片Parametric Surfaces & Bézier Patches参数曲面把参数曲线从一个参数推广到两个参数 (u,v),由少量控制点定义,运行时细分成任意多个三角形,是质量与速度之间的天然权衡:三角形多则着色和轮廓更好。矩形定义域的是贝塞尔面片(张量积曲面),三角形定义域的是贝塞尔三角形,后者是 PN 三角形和 Phong 细分的基础。游戏开发碰撞检测系统Collision Detection System碰撞检测系统判断游戏世界里的物体是否接触,本质上是一个"高级几何相交测试器",同时返回接触的详细信息。每个可碰撞对象由形状 + 变换描述,全部存放在独立的碰撞世界里;形状尽量用球、胶囊、盒、凸体等简单图元。为了在大量物体中快速找到真正相交的对,引擎使用时间相干性、空间划分,以及宽相、中相、窄相三级筛选(GEA4 卷 II 14.3)。图形学坐标空间Coordinate Spaces顶点从模型到屏幕要依次经过模型空间、世界空间、观察空间、裁剪空间、标准化设备坐标 (NDC)、窗口坐标。每一步变换都有明确目的,大部分可以用 4×4 矩阵表示并相乘合并。

输入关键词开始搜索

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