第 9 章 几何图元 (Geometric Primitives)
核心结论
-
几何图元的 4 种表示技术:隐式(满足方程的点集)、参数化(用 t 参数描述)、"特定类型"(球、平面等专用)、"显式"(列出顶点)——每种各有优劣,按场景选用。
-
线与射线:参数化
P(t) = P₀ + t d;射线 t ≥ 0;线可双向延伸;2D 隐式ax + by + c = 0与参数化互转。 -
球与圆:中心 c + 半径 r;隐式
|P − c|² = r²;点积形式P − c) · (P − c = r²;球与光线相交用 §10.4 二次方程。 -
包围盒 (AABB):轴对齐长方体,min/max 两个点描述;碰撞检测快(O(1));变换后需重算(§9.4.4)。
-
平面:隐式
n · x = d(n 是单位法向量、d 是原点到平面距离);点-平面距离|n · p − d|;平面-平面 / 平面-射线 / 平面-三角形相交。 -
三角形:3 顶点 + 法向量;面积 =
|e₁ × e₂| / 2;重心坐标α + β + γ = 1是三角形内点的代数描述。 -
多边形:分为简单 / 复杂、凸 / 凹;3D 引擎几乎只用三角形;任意多边形可 三角剖分。
|
本章主旨
本章把第 2 章的"点 / 向量"具象化为"线 / 面 / 体"等几何图元。每种图元介绍表示方法、关键运算(距离 / 相交 / 法向量)、3D 引擎中的常见应用。后续章节会用到这些图元:第 10 章的视图体(视锥体)依赖 AABB,第 11 章的碰撞检测依赖球 / 平面 / 三角形,第 13 章的曲线依赖参数化。 |
一、核心概念
本章围绕 7 个核心概念展开:从 4 种表示技术出发,依次介绍线、球、AABB、平面、三角形、多边形的几何表示与关键运算。
| 概念 | 定义 + 重要性 | 实现提示 |
|---|---|---|
4 种表示技术 |
隐式(满足方程的点集)、参数化(用 t 描述)、特定类型(球 / 平面等)、显式(顶点列表);每种适合不同任务。 |
§9.1;判别测试用隐式(点是否在内);生成图元用参数化(t 取值);碰撞用特定类型;渲染用显式。 |
线与射线 |
参数化 |
§9.2;线-线 / 线-平面 / 线-三角形相交是图形基础运算。 |
球 |
中心 c + 半径 r;隐式 ` |
P − |
² = r²` 或点积形式 |
§9.3;球-球 / 球-光线 / 球-AABB 相交是物理引擎基础。 |
AABB (轴对齐包围盒) |
由 min / max 两点描述;与坐标轴对齐;碰撞检测 O(1);变换后需重算(旋转后变 OBB)。 |
§9.4;八叉树 / BVH 加速碰撞用 AABB 做粗筛。 |
平面 |
隐式 |
§9.5;点-平面距离 ` |
n · p − |
`;平面-三角形相交;视锥剔除。 |
三角形 |
3 顶点 + 边向量 |
e₁ × e₂ |
/ 2`;重心坐标 |
§9.6;3D 引擎几何基础;重心坐标用于纹理映射、shader 插值。 |
多边形 |
简单(无自交)/ 复杂;凸(任意两点连线在多边形内)/ 凹;3D 引擎几乎只用三角形(任意多边形可 三角剖分)。 |
§9.7;多边形法向量 = 各三角形法向量之和 / 面积 加权平均。 |
二、详细笔记
2.1 4 种表示技术 (Representation Techniques)
What:4 种描述几何图元的方法——隐式、参数化、特定类型、显式。
Why:每种方法在不同任务上各有优势;选择合适的表示可大幅简化代码。
How:
| 表示 | 形式 |
|---|---|
优势场景 |
隐式 (implicit) |
满足 |
判别测试(点是否在图元上)、求交、计算距离 |
参数化 (parametric) |
|
生成图元(取 t 值遍历)、光栅化 |
特定类型 (specific type) |
球 / 平面 / 圆 等专用数据结构 |
直接的几何运算(半径 / 法向量) |
显式 (explicit) |
顶点列表 |
|
表示转换的工程实例
|
When:每设计一个新图元时考虑 4 种表示各自的成本;通常同时保留 2-3 种。
Example:3D 引擎中的"三角形"既存储为顶点(显式)、又存储为法向量(特定类型)、纹理坐标用重心坐标计算(参数化)。
2.2 线与射线 (Lines and Rays)
What:参数化 P(t) = P₀ + t d;线 t ∈ ℝ、射线 t ≥ 0、P₀ 是起点、d 是方向向量。
Why:光追、相机射线、碰撞检测、3D 拾取(鼠标点 → 3D 射线)的基础。
How:
参数化形式(§9.2):
2D 隐式形式(法线式):
其中 n = (a, b) 是单位法向量,d 是原点到线距离。
|
"射线"vs"线"
|
When:相机射线(拾取 / 光追);碰撞检测(线 vs 三角形 / 球 / AABB);曲线参数化(第 13 章)。
Example:P(t) = (1, 2, 3) + t · (0, 0, 1) = z 轴上从 (1, 2, 3) 出发的射线。
2.3 球与圆 (Spheres & Circles)
What:中心 c + 半径 r;隐式 |P − c|² = r²;点积形式 P − c) · (P − c = r²。
Why:3D 物理碰撞检测的最简单图元;点积形式避免了 sqrt 调用(平方距离比较)。
How:
隐式(§9.3):
球-球碰撞(圆心距离 ≤ 半径之和);球-AABB(§9.4);球-光线(§10.4 二次方程)。
参数化(生成球面网格):
|
点积形式的工程优势
判别"点是否在球内"用 |
When:物理引擎的"球体碰撞器";包围球(粗筛);3D 拾取的"吸附"判定。
Example:点 (0, 0, 5) 是否在中心 (0, 0, 0)、半径 3 的球内?(0²+0²+5²) = 25 > 9,不在。
2.4 包围盒 AABB (Axis-Aligned Bounding Box)
What:与坐标轴对齐的长方体;由 min / max 两点描述(每轴独立的最小最大值)。
Why:碰撞检测 O(1) 判定;BVH / 八叉树加速结构的基础;内存友好(6 个数)。
How:
AABB 表示(§9.4.1):
或用中心 + 半边长 (c, e):c = (pmin + pmax) / 2、e = (pmax - pmin) / 2。
AABB-AABB 相交(O(1)):
变换后重算(§9.4.4):旋转后 AABB 变 OBB(Oriented BB);若仍用 AABB 需重算 pmin/pmax(取旋转后所有顶点 min/max)。
|
AABB vs OBB vs 包围球
|
When:BVH / 八叉树节点;物理引擎粗筛碰撞;UI 元素边界;2D 游戏的 sprite 边界。
Example:物体占据 [0, 0, 0] ~ [2, 3, 1],AABB = { pmin = (0,0,0), pmax = (2,3,1) }。
2.5 平面 (Planes)
What:隐式 n · x = d(n 单位法向量、d 原点到平面有符号距离);3 种定义:法向量 + 距离、三点法、最佳拟合。
Why:碰撞 / 物理 / 视锥剔除 / 镜像反射面都用平面;3D 引擎必备图元。
How:
隐式形式(§9.5.1):
点-平面距离:
正数:点在法向量一侧;负数:另一侧。
三点定义平面(§9.5.2):n = (B − A) × (C − A)、d = n · A(注意单位化 n)。
|
"法向量 + d"的便利
|
When:物理碰撞平面(地面、墙);视锥体 6 个面;水面 / 镜像面;CSG 几何运算。
Example:n = (0, 1, 0)、d = 0 即 xz 平面(地面);点 (0, 5, 0) 在法向量一侧距离 5。
2.6 三角形 (Triangles)
What:3 顶点 + 边向量 e₁, e₂;面积 |e₁ × e₂| / 2;重心坐标 (α, β, γ) 满足 α + β + γ = 1。
Why:3D 引擎几何基础(GPU 渲染、碰撞、纹理映射);硬件优化(光栅化针对三角形)。
How:
边向量(§9.6):
面积(§9.6.2):
重心坐标(§9.6.3):点 P 在三角形内 ⇔ P = α P₀ + β P₁ + γ P₂,α + β + γ = 1,α, β, γ ≥ 0。
法向量:
|
重心坐标的工程用途
|
When:3D 模型网格;GPU 渲染基本单元;物理碰撞;CSG;纹理映射。
Example:三角形顶点 (0,0,0)、(1,0,0)、(0,1,0)。重心 (0.5, 0.3, 0.2) 对应点 (0.3, 0.2, 0)(在三角形内)。
2.7 多边形 (Polygons)
What:3+ 顶点的封闭图元;分简单(无自交)/ 复杂;凸(任意两点连线在多边形内)/ 凹。
Why:实际模型数据多边形数远超 3;3D 引擎几乎只用三角形(任意多边形可三角剖分)。
How:
分类(§9.7.1-§9.7.2):
-
简单 vs 复杂:边界是否自交。
-
凸 vs 凹:任意两点连线是否在多边形内。
-
三角形化 / 扇形化(§9.7.3):凹多边形必须先分解为凸子多边形再三角化。
法向量(任意多边形):
其中 A_i 是第 i 个三角形的面积、n_i 是其单位法向量。
|
多边形 vs 三角网格
|
When:模型导入;碰撞器构造(凸 vs 凹);CSG 运算(Boolean 操作)。
Example:六边形(凸六边形)= 6 顶点;可分解为 4 个三角形(fan from first vertex);3D 引擎只渲染这 4 个三角形。
三、关键图表
视觉图表
非可视化条目
|
非可视化条目(表 / 算法)
|
核心公式对照表
|
核心公式对照表
|
四、思维导图
mindmap
root((第 9 章 几何图元))
4种表示
隐式方程
参数化
特定类型
显式顶点
线与射线
参数化
隐式法线式
拾取与光追
球
中心加半径
点积形式
物理碰撞
AABB
minmax两点
O1碰撞
变换后重算
平面
法向量加d
点距离
镜像反射
三角形
3顶点
重心坐标
面积
多边形
凸凹分类
三角剖分
法向量加权
五、重点与易错点
-
4 种表示各有用途:判别测试用隐式、生成用参数化、碰撞用特定类型、渲染用显式;不要把一种表示硬套到所有场景。
-
射线 vs 线 vs 线段:射线 t ≥ 0、线 t ∈ ℝ、线段 t ∈ [t₀, t₁];3D 拾取用射线,光线追踪常用射线,碰撞边界用线段。
-
球的点积形式省一次 sqrt:批量判定"点是否在球内"用
P-c)·(P-c ≤ r²比|P-c| ≤ r快。 -
AABB 旋转后变 OBB:若仍想用 AABB 必须重算 pmin/pmax(用旋转后所有顶点的 min/max);BVH 中节点常用 AABB,但对象本身常用 OBB / 包围球。
-
平面法向量必须单位化:否则点-平面距离
n · p - d不准;三点法构造平面后立即n /= |n|。 -
三角形的"顶点顺序"决定正面:逆时针(行向量约定下左手系)通常为正面;背面剔除 / 透明排序据此判断。
-
重心坐标必须 α + β + γ = 1:三角形内点 ⇒ 三者均 ≥ 0;shader 用重心坐标插值所有顶点属性。
-
多边形法向量需面积加权:凹多边形简单平均法向量会抵消;必须用
Σ Aᵢ nᵢ。 -
*凹多边形必须先分解为凸子多边形*再三角化,否则扇形展开会出错。
-
跨章衔接:第 10 章用 AABB 构造视锥体、用平面构造视锥体 6 个面;第 11 章物理引擎用球 / AABB / 平面 / 三角形做碰撞;第 13 章曲线参数化是射线参数化的扩展。