OCCT源码解析(六):TKG3d 模块------三维曲面体系
继 TKG2d 之后,我们正式进入 OCCT 的重头戏------TKG3d (Toolkit Geometry 3D) 模块。这是承载所有三维 CAD 模型表面的数学内核。如果没有这个包里的 Geom_Surface 及其衍生类,TopoDS_Face 将只是一个空洞的拓扑概念。
本文将按"全景架构 -> 核心接口 -> 数学原理"的逻辑,为您层层剖析 TKG3d 模块的设计脉络。
一、 TKG3d 两大核心继承体系全景
三维几何体系同样遵循 "数据绝对表达" (Geom)与 "算法统一接口"(Adaptor3d)分离的设计哲学。
1. 几何表达树:Geom_Geometry 体系
这是 3D 几何对象的"数据本尊",受智能指针(Handle)管理。与 2D 中的 Geom2d_Geometry 类似,但用于描述三维空间中的几何实体。
text
Geom_Geometry (根类)
├── Geom_Point (点:定义三维空间中的单个位置)
├── Geom_Vector (向量:定义三维空间中的方向和大小)
├── Geom_Curve (空间曲线:定义三维空间中的一维流形)
│ └── Geom_Line / Geom_Conic / Geom_BoundedCurve / Geom_OffsetCurve
└── Geom_Surface (核心:双参数化曲面,定义三维空间中的二维流形)
├── Geom_ElementarySurface (基础曲面:Plane, Cylinder, Sphere, Torus, Cone)
├── Geom_SweptSurface (扫掠曲面:Revolution, Extrusion)
├── Geom_BoundedSurface (有界曲面:Bezier, BSpline, RectangularTrimmed)
└── Geom_OffsetSurface (偏移曲面:基于基准曲面在法向偏移一定距离形成)
2. 算法接口树:Adaptor3d 系列
三维算法(如求交、布尔运算、渲染)统一对接 Adaptor3d 接口。注意,3D 适配器分布在多个 Toolkit 中(如 GeomAdaptor、BRepAdaptor)。
text
Adaptor3d_Surface (曲面算法接口根类:屏蔽不同类型曲面的底层差异)
├── GeomAdaptor_Surface (通用包装:包装任意 Geom_Surface 数据)
│ ├── GeomAdaptor_SurfaceOfRevolution (针对旋转面的特化优化)
│ └── GeomAdaptor_SurfaceOfLinearExtrusion (针对拉伸面的特化优化)
└── BRepAdaptor_Surface (拓扑包装:将 TopoDS_Face 封装为算法可算的曲面)
Adaptor3d_Curve (3D 曲线算法接口根类)
├── GeomAdaptor_Curve (通用包装:包装任意 Geom_Curve 数据)
├── BRepAdaptor_Curve (拓扑包装:将 TopoDS_Edge 封装为算法可算的曲线)
├── Adaptor3d_CurveOnSurface (核心:计算面上的 2D 参数线在 3D 空间的位置)
└── Adaptor3d_IsoCurve (核心:将曲面的等参数线提取为独立曲线)
二、 核心接口设计(相较于 2D 库的特有特点)
与 2D 几何库中仅涉及单参数 uuu 的曲线不同,三维曲面是二维流形,OCCT 在这里引入了双参数 (u,v)(u, v)(u,v) 系统。这使得其核心接口在求导、法向计算以及边界描述上具有独有特点。
1. Geom_Surface:双参数求值与法向量接口
在三维空间中,曲面的求值不仅仅是获取一个点的位置,更重要的是获取该点处的偏导数,从而计算出曲面的法向量。
cpp
// 摘自 Geom_Surface.hxx (简化说明)
class Geom_Surface : public Geom_Geometry {
public:
// 特点1:双参数输入。计算参数 (U,V) 处的 3D 坐标点 P (0阶导数)
virtual void D0(const Standard_Real U, const Standard_Real V, gp_Pnt& P) const = 0;
// 特点2:提供 U 和 V 两个方向的偏导数。
// 注:D1U 叉乘 D1V 即为该点处曲面的法向量方向,这在光照渲染和干涉检查中极为重要。
virtual void D1(const Standard_Real U, const Standard_Real V,
gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V) const = 0;
// 特点3:二阶偏导数包含混合偏导 D2UV (用于计算高斯曲率、平均曲率等三维微分几何特性)
virtual void D2(const Standard_Real U, const Standard_Real V,
gp_Pnt& P, gp_Vec& D1U, gp_Vec& D1V,
gp_Vec& D2U, gp_Vec& D2V, gp_Vec& D2UV) const = 0;
// 特点4:二维参数域范围。返回曲面在 U 和 V 两个维度的自然参数范围
virtual void Bounds(Standard_Real& U1, Standard_Real& U2,
Standard_Real& V1, Standard_Real& V2) const = 0;
};
2. 特殊的 3D 适配器:降维与切片逻辑
Adaptor3d 体系不仅要包装 3D 几何,还要处理 2D 参数空间到 3D 物理空间的映射转换,这是 TKG3d 相较于 TKG2d 最显著的架构扩展。
① Adaptor3d_CurveOnSurface:降维打击的求值逻辑
这是 BRep 边(Edge)的真实数学底色,是连接 2D 参数空间与 3D 物理空间的桥梁。一条边在 3D 空间看是一条曲线,但在数学上它是"某曲面(Surface)上的一条 2D 参数曲线(Curve2d)"。
cpp
// 内部求值逻辑说明 (伪代码)
void Adaptor3d_CurveOnSurface::D0(const Standard_Real U, gp_Pnt& P) const {
// 1. 调用 2D 适配器,算出该参数 U 对应在参数平面上的 (u, v) 坐标
gp_Pnt2d uv = myCurve->Value(U);
// 2. 将 (u, v) 代入 3D 曲面适配器,算出对应的三维空间 XYZ 坐标
mySurface->D0(uv.X(), uv.Y(), P);
}
② Adaptor3d_IsoCurve:曲面的"切片机"
允许开发者通过固定曲面的 uuu 或 vvv 参数,将一个曲面"降维"提取为一条三维空间曲线(等参数线)。这对于生成渲染网格(网格化)或曲面分析尤为重要。
三、 各类几何类型的详细数学原理
三维几何对象的数学表达是整个 TKG3d 的基础。以下逐一介绍各类常见三维曲面的底层数学原理。
1. 基础曲面 (Geom_ElementarySurface)
所有的基础曲面都持有一个局部右手坐标系 gp_Ax3,记作 (O,X⃗,Y⃗,Z⃗)(O, \vec{X}, \vec{Y}, \vec{Z})(O,X ,Y ,Z ),其中 OOO 为原点,X⃗,Y⃗,Z⃗\vec{X}, \vec{Y}, \vec{Z}X ,Y ,Z 为正交基向量。
1.1 平面 (Geom_Plane)
平面是最简单的双参数线性流形。
- 参数方程 :S(u,v)=O+u⋅X⃗+v⋅Y⃗S(u, v) = O + u \cdot \vec{X} + v \cdot \vec{Y}S(u,v)=O+u⋅X +v⋅Y
- 参数范围 :u∈(−∞,+∞),v∈(−∞,+∞)u \in (-\infty, +\infty), v \in (-\infty, +\infty)u∈(−∞,+∞),v∈(−∞,+∞)
- 法向量 :始终等于局部坐标系的 Z 轴方向 Z⃗\vec{Z}Z 。
1.2 圆柱面 (Geom_CylindricalSurface)
以 Z 轴为中心轴,半径为 RRR 的圆柱面。uuu 控制角度,vvv 控制高度。
- 参数方程 :S(u,v)=O+Rcos(u)X⃗+Rsin(u)Y⃗+vZ⃗S(u, v) = O + R \cos(u)\vec{X} + R \sin(u)\vec{Y} + v\vec{Z}S(u,v)=O+Rcos(u)X +Rsin(u)Y +vZ
- 参数范围 :u∈[0,2π],v∈(−∞,+∞)u \in [0, 2\pi], v \in (-\infty, +\infty)u∈[0,2π],v∈(−∞,+∞)
- 周期性 :在 UUU 方向是周期的。
1.3 球面 (Geom_SphericalSurface)
以原点 OOO 为球心,半径为 RRR 的球面。uuu 为经度,vvv 为纬度。
- 参数方程 :
X(u,v)=Rcos(v)cos(u) X(u,v) = R \cos(v) \cos(u) X(u,v)=Rcos(v)cos(u)
Y(u,v)=Rcos(v)sin(u) Y(u,v) = R \cos(v) \sin(u) Y(u,v)=Rcos(v)sin(u)
Z(u,v)=Rsin(v) Z(u,v) = R \sin(v) Z(u,v)=Rsin(v) - 参数范围 :u∈[0,2π],v∈[−π/2,π/2]u \in [0, 2\pi], v \in [-\pi/2, \pi/2]u∈[0,2π],v∈[−π/2,π/2]
- 奇点说明 :在两极点 (v=±π/2v = \pm\pi/2v=±π/2) 处,uuu 方向的一阶偏导数退化为零向量。因此 BRep 拓扑算法在处理球体两极时,必须引入"退化边 (Degenerated Edge)"。
1.4 圆锥面 (Geom_ConicalSurface)
由半顶角 α\alphaα 和基圆半径 RRR 定义的圆锥。
- 参数方程 :
S(u,v)=O+(R+vsin(α))(cos(u)X⃗+sin(u)Y⃗)+vcos(α)Z⃗ S(u, v) = O + (R + v \sin(\alpha)) (\cos(u)\vec{X} + \sin(u)\vec{Y}) + v \cos(\alpha)\vec{Z} S(u,v)=O+(R+vsin(α))(cos(u)X +sin(u)Y )+vcos(α)Z - 参数范围 :u∈[0,2π],v∈(−∞,+∞)u \in [0, 2\pi], v \in (-\infty, +\infty)u∈[0,2π],v∈(−∞,+∞)
- 奇点说明 :当半径收敛至锥顶时(对应特定的 vvv 值),同样会产生导数退化的奇点。
1.5 环面 (Geom_ToroidalSurface)
由主半径 RRR 和小圆半径 rrr 定义。
- 参数方程 :
X(u,v)=(R+rcos(v))cos(u) X(u,v) = (R + r \cos(v)) \cos(u) X(u,v)=(R+rcos(v))cos(u)
Y(u,v)=(R+rcos(v))sin(u) Y(u,v) = (R + r \cos(v)) \sin(u) Y(u,v)=(R+rcos(v))sin(u)
Z(u,v)=rsin(v) Z(u,v) = r \sin(v) Z(u,v)=rsin(v) - 参数范围 :u∈[0,2π],v∈[0,2π]u \in [0, 2\pi], v \in [0, 2\pi]u∈[0,2π],v∈[0,2π],在 U 和 V 方向都是周期的。
2. 扫掠曲面 (Geom_SweptSurface)
扫掠曲面由一条基准曲线(Basis Curve)通过空间运动轨迹生成。
2.1 线性拉伸面 (Geom_SurfaceOfLinearExtrusion)
将基准曲线 C(u)C(u)C(u) 沿给定方向向量 D⃗\vec{D}D 拉伸生成。
- 参数方程 :S(u,v)=C(u)+v⋅D⃗S(u, v) = C(u) + v \cdot \vec{D}S(u,v)=C(u)+v⋅D
- 参数说明 :uuu 继承自基准曲线的参数,vvv 表示沿方向向量拉伸的距离参数。
2.2 旋转面 (Geom_SurfaceOfRevolution)
将基准曲线 C(v)C(v)C(v) 绕空间中指定的旋转轴转动形成。
- 参数说明 :uuu 为旋转角度参数(000 到 2π2\pi2π),vvv 继承自基准曲线。通过
GeomAdaptor_SurfaceOfRevolution适配器可提供极其高效的数学计算优化。
3. 自由曲面 (Geom_BSplineSurface 与 Geom_BezierSurface)
对于不规则的复杂形态,OCCT 使用 NURBS (Non-Uniform Rational B-Splines) 及其特例 Bezier 曲面来表达,这是现代 CAD 工业建模的绝对主力。
3.1 B样条曲面 (Geom_BSplineSurface)
通过二维控制点网格 Pi,jP_{i,j}Pi,j、对应的权重网格 wi,jw_{i,j}wi,j 以及 uuu 和 vvv 方向的节点向量(Knot Vector)定义。
- 参数方程 (有理 B 样条):
S(u,v)=∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,jPi,j∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,j S(u, v) = \frac{\sum_{i=0}^{n} \sum_{j=0}^{m} N_{i,p}(u) M_{j,q}(v) w_{i,j} P_{i,j}}{\sum_{i=0}^{n} \sum_{j=0}^{m} N_{i,p}(u) M_{j,q}(v) w_{i,j}} S(u,v)=∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,j∑i=0n∑j=0mNi,p(u)Mj,q(v)wi,jPi,j - 解析 :Ni,p(u)N_{i,p}(u)Ni,p(u) 和 Mj,q(v)M_{j,q}(v)Mj,q(v) 分别是 uuu 方向 ppp 次、vvv 方向 qqq 次的 B 样条基函数。由于采用控制点网格,它提供了局部修改特性的能力,即改变一个控制点只影响曲面的局部形状。
3.2 Bezier 曲面 (Geom_BezierSurface)
可以看作是 B 样条曲面的特例(没有内节点,只有端节点)。
- 参数方程:使用 Bernstein 多项式作为基函数。
- 特点:不具有局部控制性,改变任一控制点会影响整个曲面,因此在复杂模型中通常作为被裁剪的小面片存在。
四、 高阶近似与拟合:AdvApprox 体系
在 CAD 的实际运算(如布尔求交、偏移操作、倒角等)中,经常会产生非常复杂的解析几何曲线与曲面。为了统一向下游输出数据,OCCT 需要将这些复杂的几何体"近似"拟合成标准的 NURBS(B 样条)形式。TKG3d 模块中以 AdvApprox_ 为前缀的类群,正是承担这一关键任务的数学引擎。
1. AdvApprox 的核心职责
AdvApprox (Advanced Approximation) 提供了一套高精度的逼近算法,其主要目标是在给定的公差(Tolerance)范围内,用相对简单的多项式(通常是 B 样条曲线/曲面)来拟合任意复杂的参数化几何函数。
- 数据降维与统一:将求交或投影产生的高维度、高复杂度数据转换为紧凑的标准 B 样条控制点网络。
- 误差严格控制:算法允许开发者严格设定最大允许偏差,确保拟合后的几何体与真实解析解的偏离度在工业制造标准之内。
2. 关键类与其数学手段
- AdvApprox_ApproxAFunction :这是整个近似算法的核心执行类。它接受一个待拟合的数学函数(通常包装为特定的 Evaluator 接口),并在满足指定的连续性要求(如 C0,C1,C2C^0, C^1, C^2C0,C1,C2)和精度要求的前提下,计算出近似的 B 样条表达。
- AdvApprox_PrefAndRec:用于管理参数域的细分规则(Cutting preferences)和精度权重控制的配置类。
- 底层原理:该体系底层深切依赖于**切比雪夫多项式(Chebyshev Polynomials)**逼近和最小二乘法。通过将复杂函数投影到正交多项式基函数空间,系统能够在尽量减少控制点数量的同时有效抑制龙格现象(Runge's phenomenon),实现高平滑度的曲线曲面重构。
掌握 AdvApprox 的工作机制,是解决 OCCT 中"为什么布尔求交会产生控制点极多的 B 样条"或者"如何优化高级曲面操作产生的冗余几何数据"等高阶疑难问题的必经之路。
五、 跨越鸿沟:TKG3d 几何与 TopAbs 拓扑的羁绊
虽然本篇文档的核心是解析 TKG3d(纯数学几何层),但如果在实际建模中脱离了拓扑(Topology),这些几何曲面将只是无限延伸的数学函数。OCCT 严格遵循了 几何(Geometry)与拓扑(Topology)分离 的底层哲学。为了完整理解 3D 模型是如何被组装的,我们必须前瞻性地引入拓扑体系的核心抽象------TopAbs。
1. TopAbs 包的"四大金刚"
TopAbs 包的设计极其克制,它的源码目录下只有这 4 个头文件。它们不包含任何三维坐标或曲面公式,纯粹定义了实体的状态与层级关系:
TopAbs_ShapeEnum.hxx(拓扑类型枚举) :定义了 BRep(边界表示法)模型的层级树。包含VERTEX(顶点)、EDGE(边)、WIRE(线框)、FACE(面)、SHELL(壳)、SOLID(体)、COMPSOLID以及COMPOUND。必须明确:这里的FACE仅仅是一个枚举标记,它必须与TKG3d里的Geom_Surface结合,才是一个有形状的"面"。TopAbs_Orientation.hxx(拓扑方向枚举) :定义了FORWARD(正向)、REVERSED(反向)、INTERNAL(内部)和EXTERNAL(外部)。- 重要意义 :几何曲面的法向量是由其参数方程(D1U×D1VD_1U \times D_1VD1U×D1V)绝对决定的。但同一个圆柱面可以既用来表示外圆柱面(法向朝外),也能表示内孔洞(法向朝内)。
TopAbs_Orientation就是这把翻转法向的"开关",让不同拓扑面可以共享同一个底层几何,极大节省内存。
- 重要意义 :几何曲面的法向量是由其参数方程(D1U×D1VD_1U \times D_1VD1U×D1V)绝对决定的。但同一个圆柱面可以既用来表示外圆柱面(法向朝外),也能表示内孔洞(法向朝内)。
TopAbs_State.hxx(拓扑状态枚举) :定义了IN(内部)、OUT(外部)、ON(边界上)和UNKNOWN(未知)。它是 OCCT 高级算法的核心状态量,例如在布尔运算或射线相交(Ray-Tracing)算法中,用于判定一个点或另一条实体相对于当前几何面的位置状态。TopAbs.hxx(包级别工具类) :作为基础工具类,主要提供针对上述枚举的辅助静态函数。例如快速反转一个Orientation,或者将枚举值进行字符串的互相转换打印等。
2. 拓扑(TopAbs)与几何(TKG3d)的绑定法则
理解了这两者,也就理解了 OCCT 架构的核心机密:
BRep 实体对象 (如 TopoDS_Face)=TopAbs 拓扑外壳 (边界与方向)+TKG3d 数学几何 (底层流形方程) \text{BRep 实体对象 (如 TopoDS\_Face)} = \text{TopAbs 拓扑外壳 (边界与方向)} + \text{TKG3d 数学几何 (底层流形方程)} BRep 实体对象 (如 TopoDS_Face)=TopAbs 拓扑外壳 (边界与方向)+TKG3d 数学几何 (底层流形方程)
TKG3d 提供了无限延伸的画布,而 TopAbs 提供了剪刀。当我们对一个 TopoDS_Face 进行面积计算或网格化时,OCCT 会使用第一小节中提到的 BRepAdaptor_Surface,剥开它的 TopAbs 拓扑外壳,读取其边界,并最终将求值运算委托给 TKG3d 的底层数学接口。
总结
TKG3d 模块通过严密的双参数 (u,v)(u,v)(u,v) 求导体系,统一了从基础解析几何到高阶复杂 NURBS 曲面的底层计算模型。同时,通过引入 CurveOnSurface 和 IsoCurve 等适配器(Adaptor3d),完美解决了 2D 参数空间向 3D 物理空间的映射问题;AdvApprox 体系为复杂几何的标准化表达提供了坚实的后盾;而最后引入的 TopAbs 概念,则彻底打通了纯数学几何与 CAD 拓扑实体之间的桥梁。掌握了这五大章节的核心原理,便能深度理解 OCCT 布尔运算、求交以及网格化背后的数学运转逻辑。