数学基础(一):参数曲面表示方法
做自由曲面设计,数学基础是绕不开的坎。说实话,我刚入行那会儿也觉得这些公式太抽象,直到第一次用Bezier曲面拼了个复杂面型,结果在连接处出现了肉眼可见的棱线——嗯,从那以后我再也不敢轻视这些数学工具了。
这一章我们重点聊三个东西:NURBS、Bezier、B样条。它们本质上都是参数曲面的数学表达,但各有各的脾气。
Bezier曲面:最直观的起点
Bezier曲面是最容易理解的一种。它由一组控制点网格定义,曲面形状完全由这些点决定。说白了,你移动一个控制点,曲面就会跟着变形。
数学表达式长这样:
S(u,v) = Σᵢ₌₀ᵐ Σⱼ₌₀ⁿ Bᵢₚ(u) Bⱼₚ(v) Pᵢⱼ
其中Bᵢₚ(u)是Bernstein基函数。p是次数,一般用3次就够了。我个人的习惯是,除非有特殊需求,否则别用超过5次的Bezier——数值稳定性会变差。
关键特性:
- 曲面通过首尾控制点(端点插值)
- 移动一个控制点会影响整个曲面(全局性)
- 凸包性质:曲面始终在控制点构成的凸包内
我在项目中遇到过一个问题:用Bezier曲面拼接一个大面型时,相邻曲面在边界处很难做到光滑过渡。因为Bezier是全局控制的,你调整一个曲面的控制点,另一个曲面也得跟着调,非常麻烦。这就是为什么后来B样条成了主流。
B样条曲面:局部控制的利器
B样条解决了Bezier的全局性问题。它引入了节点向量(knot vector),把曲面分成多个小段,每个控制点只影响局部区域。
表达式:
S(u,v) = Σᵢ₌₀ⁿ Σⱼ₌₀ᵐ Nᵢₚ(u) Nⱼₚ(v) Pᵢⱼ
Nᵢₚ(u)是B样条基函数,由节点向量递归定义。这里有个坑:节点向量的选择直接影响曲面质量。我刚开始做的时候,随便给了个均匀节点向量,结果曲面在两端出现了奇怪的波动。
避坑指南:我曾经在给一个反射镜建模时,用了均匀节点向量,结果边缘曲率突变,加工出来的镜片边缘有肉眼可见的波纹。后来改用Clamped节点向量(两端重复节点),问题就解决了。
B样条的好处是:你可以单独调整某个区域的形状,而不影响其他地方。比如你想让曲面中间更陡一些,只需要移动中间的几个控制点就行。
NURBS:工业界的标准
NURBS(非均匀有理B样条)是B样条的升级版。它引入了权重因子,可以精确表示圆锥曲线和球面等二次曲面。说白了,B样条能做的它都能做,而且做得更好。
表达式:
S(u,v) = ( Σᵢ Σⱼ Nᵢₚ(u) Nⱼₚ(v) wᵢⱼ Pᵢⱼ ) / ( Σᵢ Σⱼ Nᵢₚ(u) Nⱼₚ(v) wᵢⱼ )
wᵢⱼ就是权重。权重越大,曲面越靠近对应的控制点。这个参数非常有用,我经常用它来微调曲面局部曲率。
| 曲面类型 | 控制点影响范围 | 能否精确表示圆锥 | 权重支持 |
|---|---|---|---|
| Bezier | 全局 | 否 | 否 |
| B样条 | 局部 | 否 | 否 |
| NURBS | 局部 | 是 | 是 |
你想想看,为什么NURBS成了CAD/CAM的标准?因为它既能做自由曲面,又能精确表示标准几何体。一个软件如果只支持Bezier,那连个完美的球面都画不出来。
曲面连续性:C0、C1、C2
曲面连续性描述的是两个曲面片在连接处的光滑程度。这个在光学设计中极其重要——一个不连续的反射面,会把光线反射到错误的方向。
C0连续(位置连续)
两个曲面在边界处位置相同,没有缝隙。这是最基本的要求。我见过一些新手设计的曲面,明明控制点坐标是对的,但计算出来就是有缝隙——后来发现是参数化方向不一致导致的。
C1连续(切平面连续)
在C0的基础上,边界处的切平面方向一致。说白了,曲面在连接处不会出现棱线。对于大多数光学反射镜,C1是基本要求。
C2连续(曲率连续)
在C1的基础上,边界处的曲率也连续。这个要求比较高,一般用于高端成像系统。我记得有一次做车载镜头,客户要求反射面必须C2连续,否则像质过不了。
个人经验:判断连续性有个简单方法——看曲率云图。如果云图在边界处有突变,那就是C1以下;如果平滑过渡,至少是C1。C2的话,曲率变化率也是连续的。
法向量与曲率计算
这两个东西是光学设计的核心。法向量决定了光线的反射方向,曲率决定了光线的聚焦能力。
法向量计算
对于参数曲面S(u,v),法向量由偏导数的叉积得到:
N = ∂S/∂u × ∂S/∂v
然后归一化:n = N / |N|
这里有个细节:法向量的方向取决于u、v的排列顺序。我习惯用右手定则,保证法向量指向曲面外侧。如果方向反了,光线追迹会全错。
曲率计算
曲率分两种:主曲率和平均曲率。主曲率是曲面在某点处最大和最小的弯曲程度,平均曲率是两者的平均值。
计算步骤:
- 计算第一基本形式系数:E、F、G
- 计算第二基本形式系数:L、M、N
- 求解特征方程得到主曲率k1、k2
公式我就不列了,实际编程时直接用数值方法算更靠谱。我一般用有限差分法,步长取1e-5左右。
注意:曲率计算对曲面质量非常敏感。如果曲面有微小的波动,曲率云图会立刻显示出来。我曾经用NURBS拟合一个测量数据点云,拟合误差只有0.1微米,但曲率云图上一片混乱——后来发现是节点向量分布不合理导致的。
知识体系总览
下面这张图概括了本章的核心内容:
这张图把本章的知识点串起来了。从三种曲面表示方法出发,到连续性要求,再到法向量和曲率计算,最终都服务于光学设计。
好了,数学基础这部分先讲到这里。下一章我们会深入讨论曲面拟合和插值算法,到时候会用到今天讲的这些概念。嗯,先把这些基础打牢,后面才能走得更远。
公众号:蓝海资料掘金营,微信deep3321