数学基础(一):参数曲面表示方法
做自由曲面设计,说白了就是跟数学曲线曲面打交道。你想想看,我们要描述一个自由曲面,总不能拿尺子去量每个点的坐标吧?那就得靠参数曲面。这一章我带你把这套数学工具摸透。
为什么需要参数曲面?
我刚开始做光学设计时,也想过直接用函数表达式 z = f(x,y) 来描述曲面。但很快发现,这种显式表示法有个致命问题——它没法描述多值曲面,比如一个曲面在同一个 (x,y) 位置有两个不同的 z 值。自由曲面经常出现这种复杂形状,所以必须用参数化方法。
参数曲面说白了就是:用两个独立参数 (u,v) 来控制曲面上每个点的位置。就像你拿着一个可伸缩的网,u 和 v 就是网上的经纬线。
核心概念:参数曲面 S(u,v) = (x(u,v), y(u,v), z(u,v)),其中 u,v ∈ [0,1]
三种主流参数曲面表示法
在实际工程中,最常用的就是 Bezier、B样条 和 NURBS。我按自己的理解给你捋一捋它们的区别。
| 类型 | 控制点影响范围 | 局部修改能力 | 精确表示圆锥曲线 | 工程应用场景 |
|---|---|---|---|---|
| Bezier | 全局影响 | 差 | 不能 | 简单曲面、教学演示 |
| B样条 | 局部影响 | 好 | 不能 | 汽车车身、自由曲面 |
| NURBS | 局部影响 | 好 | 能 | 光学自由曲面、CAD/CAM |
Bezier 曲面:最直观的入门
Bezier 曲面的数学形式其实很简单。它由一组控制点网格定义,每个控制点都有一个 Bernstein 基函数作为权重。
// Bezier 曲面公式(双三次,4×4 控制点)
S(u,v) = Σᵢ₌₀³ Σⱼ₌₀³ Pᵢⱼ · Bᵢ³(u) · Bⱼ³(v)
其中 Bᵢⁿ(t) = C(n,i) · tⁱ · (1-t)ⁿ⁻ⁱ
我记得第一次用 Bezier 曲面做透镜时,遇到一个问题:想微调曲面边缘的局部形状,结果整个曲面都变了。这就是 Bezier 的全局性——移动一个控制点,整个曲面都会受影响。
避坑指南:我曾经在项目里用 Bezier 曲面做自由曲面反射镜,调试了三天才发现,因为控制点数量太少(3×3),曲面自由度不够,导致优化结果不理想。后来换成 6×6 的控制点网格才解决问题。记住:控制点数量直接决定你能描述的曲面复杂度。
B样条曲面:局部控制的利器
B样条曲面解决了 Bezier 的全局性问题。它的核心思想是:每个控制点只影响曲面的局部区域。这个局部范围由节点向量(Knot Vector)决定。
节点向量说白了就是一组递增的实数序列,它把参数域 [0,1] 分成若干段。每个控制点只在对应的几个段内有影响力。
// 均匀 B样条节点向量示例(3次,5个控制点)
Knot = [0, 0, 0, 0, 0.25, 0.5, 0.75, 1, 1, 1, 1]
// 前4个0和后4个1是重复节点,保证曲线经过首尾控制点
你想想看,如果我想修改曲面左侧的局部形状,只需要调整左侧的几个控制点,右侧完全不受影响。这在光学设计中太重要了——比如你只需要优化镜片边缘的像差,就不动中心区域。
NURBS:工业标准
NURBS(非均匀有理B样条)是 B样条的升级版。它引入了权重因子,让每个控制点可以有不同的"吸引力"。权重越大,曲面越靠近该控制点。
为什么 NURBS 能精确表示圆锥曲线?因为它用了有理分式。比如一个球面,用 NURBS 可以精确描述,而普通 B样条只能近似。
个人经验:我在做自由曲面照明系统时,经常用 NURBS 曲面。因为它既能描述球面、非球面这些传统光学面型,又能描述任意自由曲面。一套工具搞定所有需求,省心。
曲面阶次与连续性
阶次(Degree)和连续性(Continuity)是衡量曲面光滑程度的两个关键指标。
- 阶次:曲面的多项式次数。3次曲面是最常用的,因为它在计算效率和曲面质量之间取得了平衡。
- 连续性:C⁰ 表示位置连续,C¹ 表示切向连续,C² 表示曲率连续。
在光学设计中,我一般要求曲面至少 C¹ 连续。如果做高精度成像系统,必须 C² 连续。为什么?因为光线追迹需要计算曲面的二阶导数(曲率),如果 C² 不连续,光线会突然偏折,产生像差。
| 连续性等级 | 数学含义 | 光学影响 | 典型应用 |
|---|---|---|---|
| C⁰ | 位置连续 | 可见接缝 | 照明反射器 |
| C¹ | 切向连续 | 光线平滑转折 | 一般成像系统 |
| C² | 曲率连续 | 无像散突变 | 高端镜头、自由曲面 |
注意:曲面阶次不是越高越好。阶次太高会导致曲面振荡(Runge 现象),而且计算量剧增。我见过有人用 7 次 NURBS 做自由曲面,结果曲面像蛇一样扭来扭去,根本没法用。3次就够了。
控制点与节点向量的关系
控制点数量和节点向量长度之间有个固定关系:
节点向量长度 = 控制点数量 + 阶次 + 1
例如:3次曲面,10个控制点
节点向量长度 = 10 + 3 + 1 = 14
节点向量的分布方式决定了曲面的性质:
- 均匀节点:控制点均匀分布,曲面形状较平滑
- 非均匀节点:可以在某些区域密集控制点,实现局部精细调节
- 重复节点:让曲面经过某个控制点,或者产生尖角
我个人习惯在曲面边缘使用重复节点,这样曲面能精确通过边界控制点,方便与其他曲面拼接。
知识结构图
下面这张图帮你理清本章的知识脉络:
实际工程中的选择建议
说了这么多理论,到底怎么选?我直接给你一个实用清单:
- 简单曲面原型验证:用 Bezier,代码好写,调试方便
- 需要局部优化的自由曲面:用 B样条,控制灵活
- 需要精确球面/非球面的混合曲面:用 NURBS,一个模型搞定所有
- 曲面阶次:一律用 3 次,别问为什么,这是工程经验
- 连续性要求:照明系统 C¹ 够用,成像系统必须 C²
小技巧:我在做自由曲面优化时,会先用少量控制点(比如 4×4)快速迭代,找到大致形状后,再加密到 8×8 做精细优化。这样既快又稳。
嗯,这一章的内容就到这里。参数曲面是自由曲面设计的数学根基,理解透了,后面做优化、分析、加工才能得心应手。