数学基础(一):参数曲面表示方法

做自由曲面设计,说白了就是跟数学曲线曲面打交道。你想想看,我们要描述一个自由曲面,总不能拿尺子去量每个点的坐标吧?那就得靠参数曲面。这一章我带你把这套数学工具摸透。

为什么需要参数曲面?

我刚开始做光学设计时,也想过直接用函数表达式 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

节点向量的分布方式决定了曲面的性质:

  • 均匀节点:控制点均匀分布,曲面形状较平滑
  • 非均匀节点:可以在某些区域密集控制点,实现局部精细调节
  • 重复节点:让曲面经过某个控制点,或者产生尖角

我个人习惯在曲面边缘使用重复节点,这样曲面能精确通过边界控制点,方便与其他曲面拼接。

知识结构图

下面这张图帮你理清本章的知识脉络:

参数曲面表示方法知识结构图 参数曲面表示方法知识体系 参数曲面 S(u,v) Bezier 曲面 B样条曲面 NURBS 曲面 全局影响 · 简单直观 局部控制 · 节点向量 权重因子 · 精确圆锥 控制点网格 节点向量分布 阶次 · C⁰/C¹/C² 💡 工程建议 优先使用 3 次 NURBS 曲面 控制点数量 6×6 ~ 10×10 之间

实际工程中的选择建议

说了这么多理论,到底怎么选?我直接给你一个实用清单:

  1. 简单曲面原型验证:用 Bezier,代码好写,调试方便
  2. 需要局部优化的自由曲面:用 B样条,控制灵活
  3. 需要精确球面/非球面的混合曲面:用 NURBS,一个模型搞定所有
  4. 曲面阶次:一律用 3 次,别问为什么,这是工程经验
  5. 连续性要求:照明系统 C¹ 够用,成像系统必须 C²

小技巧:我在做自由曲面优化时,会先用少量控制点(比如 4×4)快速迭代,找到大致形状后,再加密到 8×8 做精细优化。这样既快又稳。

嗯,这一章的内容就到这里。参数曲面是自由曲面设计的数学根基,理解透了,后面做优化、分析、加工才能得心应手。