第2章 参数曲线基础:参数化表示、切向量与法向量、曲线的曲率与挠率
各位同学,欢迎来到第二章。上一章我们聊了自由曲面的整体轮廓,今天咱们得把地基打牢——参数曲线。你想想看,曲面本质上就是曲线的“集合”或者“扫掠”。搞不懂曲线,曲面就是空中楼阁。
我个人习惯,在开始任何曲面造型之前,都会先在脑子里把曲线的“骨架”理清楚。这一章,我们就来啃下这三块硬骨头:参数化表示、切向量与法向量、曲率与挠率。
核心观点: 参数曲线是用一个参数 t 把空间点的坐标 (x, y, z) 串联起来。它比显式函数 y=f(x) 强大得多,能描述任何复杂回环、甚至垂直的曲线。
2.1 参数化表示:给曲线一个“身份证”
什么是参数化?说白了,就是给曲线上的每个点配一个“编号” t。t 从 0 变到 1,点就从起点走到终点。
数学上,我们写成:
C(t) = (x(t), y(t), z(t)), t ∈ [a, b]
举个例子,一个半径为 R 的圆,用参数方程写就是:
C(t) = (R·cos(t), R·sin(t), 0), t ∈ [0, 2π]
你看,t 是角度,从 0 转到 2π,圆就画出来了。如果用 y = ±√(R² - x²) 这种显式形式,你得写两个函数,还容易漏掉点。这就是参数化的优势。
| 表示方式 | 优点 | 缺点 |
|---|---|---|
| 显式 y=f(x) | 直观,计算简单 | 无法表示多值、垂直曲线 |
| 隐式 F(x,y)=0 | 适合判断点是否在曲线上 | 参数化困难,不易生成点 |
| 参数式 C(t) | 通用性强,适合计算与渲染 | 参数化不唯一,需谨慎选择 |
我的经验: 在汽车A级曲面设计中,我们经常用三次样条曲线。参数 t 通常取“弦长参数化”,也就是按点之间的实际距离来分配 t 值。这样做出来的曲线更光顺,不会出现“一顿一顿”的感觉。
2.2 切向量与法向量:曲线在“动”的方向
有了曲线,我们得知道它往哪儿走、拐弯有多急。这就引出了切向量。
切向量,就是曲线对参数 t 求导:
T(t) = C'(t) = (dx/dt, dy/dt, dz/dt)
这个向量指向曲线前进的方向。它的长度 |T(t)| 就是“速度”。如果速度恒为 1,我们叫它弧长参数化,这是最理想的参数化方式。
为什么会这样?因为弧长参数化下,切向量就是单位切向量,计算曲率、法向量时能省掉一堆麻烦的链式法则。我在做数控加工路径规划时,就吃过这个亏——一开始没做弧长参数化,结果算出来的进给速度忽快忽慢,差点把刀具崩了。
有了切向量,我们就能定义法向量。对于平面曲线,法向量就是切向量逆时针旋转 90 度。对于空间曲线,情况复杂一些,我们通常需要两个法向量:
- 主法向量 N(t):指向曲线弯曲的方向,与切向量垂直。
- 副法向量 B(t):由切向量和主法向量叉乘得到,即 B = T × N。
这三个向量构成了曲线的Frenet 标架,是曲线局部性质的“坐标系”。
避坑指南: 我曾经在逆向工程中,直接用了离散点的差分来算切向量。结果噪声一放大,切向量方向乱跳。后来我改用最小二乘拟合局部多项式再求导,才稳定下来。记住:数值微分对噪声极其敏感,一定要先平滑再求导。
2.3 曲率与挠率:曲线“弯”和“扭”的程度
曲率 κ 描述曲线弯曲的剧烈程度。半径 R 的圆,曲率 κ = 1/R。直线呢?曲率为 0。
数学定义:
κ = |T'(s)| = |C''(s)| (弧长参数 s 下)
如果是普通参数 t,公式会复杂一些:
κ = |C'(t) × C''(t)| / |C'(t)|³
挠率 τ 描述曲线“扭转”的程度,也就是曲线偏离平面的程度。平面曲线的挠率恒为 0。空间曲线才有挠率。
挠率的公式:
τ = (C'(t) × C''(t)) · C'''(t) / |C'(t) × C''(t)|²
嗯,这里要注意:挠率可正可负,正负号代表扭转的方向。
| 几何量 | 物理意义 | 典型值 |
|---|---|---|
| 曲率 κ | 弯曲程度 | 直线 κ=0,圆 κ=1/R |
| 挠率 τ | 扭转程度 | 平面曲线 τ=0,螺旋线 τ≠0 |
实际应用: 在车身曲面光顺性评价中,我们常用“曲率梳”来检查曲线。如果曲率梳的线条变化均匀,说明曲线光顺;如果出现尖点或突变,那里就是“坑”,需要调整控制点。挠率则用于检查曲面是否“扭曲”,比如在汽车门把手附近,挠率变化过大会导致光影不顺。
2.4 知识体系:参数曲线核心逻辑
下面这张图,是我自己总结的参数曲线知识框架。你把它印在脑子里,后面学曲面会轻松很多。
2.5 实战:计算一条三次贝塞尔曲线的曲率
光说不练假把式。我们来看一个具体的例子。假设有一条三次贝塞尔曲线,控制点为 P0, P1, P2, P3:
C(t) = (1-t)³·P0 + 3t(1-t)²·P1 + 3t²(1-t)·P2 + t³·P3, t∈[0,1]
取具体坐标:P0=(0,0), P1=(1,2), P2=(3,2), P3=(4,0)。
第一步,求一阶导 C'(t) 和二阶导 C''(t)。
C'(t) = -3(1-t)²·P0 + 3(1-t)(1-3t)·P1 + 3t(2-3t)·P2 + 3t²·P3
C''(t) = 6(1-t)·P0 + 6(3t-2)·P1 + 6(1-3t)·P2 + 6t·P3
第二步,代入 t=0.5,计算数值:
C'(0.5) = (3, 0)
C''(0.5) = (0, -6)
第三步,代入曲率公式:
κ = |C' × C''| / |C'|³ = |(3,0) × (0,-6)| / (3²+0²)^(3/2) = 18 / 27 = 0.667
所以,在 t=0.5 处,曲线的曲率约为 0.667,对应的曲率半径为 1.5。这个值告诉我们,曲线在中间位置弯曲得比较厉害。
我的建议: 在实际工程中,别手算这些。用 Python 的 NumPy 或者 MATLAB 的 Symbolic Toolbox 来自动求导。我一般会写一个函数,输入控制点,输出曲率梳图,一眼就能看出曲线哪里有问题。
好了,这一章的内容就到这里。参数曲线是自由曲面的“细胞”,把切向量、曲率、挠率这些概念吃透,后面学曲面的时候你会觉得“原来如此”。记住:曲线光顺,曲面才光顺。这是我在无数项目中摔打出来的铁律。