返回 HackerTubeYouTube2026年11月13日视频时长:24:25

贝塞尔曲线之美:从线性插值到沿路径运动

The Beauty of Bézier Curves

FHFreya Holmér

完整字幕

中文
查看原视频
本篇目录

路径不仅仅是一条形状

查看原文 00:00

摄像机可以沿路径飞行,游戏中的轨道也可以随路径弯曲。但一条实用的路径还要告诉我们:它指向哪里、转弯有多急,以及物体已经走了多远。Freya Holmér 在 2021 年的视频中,从一个很小的操作出发逐步回答这些问题:在点与点之间插值。

她举出的例子包括过山车,以及她的游戏 Flowstorm 中可以编辑的轨道。把曲线段连接起来可以形成样条曲线;这里重点讨论的是单个贝塞尔曲线段,尤其是三次曲线,而非整个样条家族。

反复插值可以构造曲线

查看原文 01:44

线性插值,简称 lerp,用 lerp(A, B, t) = (1 − t)A + tB 混合两点 A 和 B。t = 0 时得到 A,t = 1 时得到 B,t = 0.5 时得到中点。这里的 t 取值为 0 到 1。

有三个控制点 P0、P1 和 P2 时,先用同一个 t 分别在相邻两条边上插值,再在所得的两个点之间插值。随着 t 变化,最后一个点描绘出二次贝塞尔曲线。有四个控制点时,按同样方法进行三层插值:先得到三个中间点,再得到两个,最后得到一个。最终点描绘出三次曲线。移动控制点可以改变路径,而构造规则不变。

查看原图

在 02:58,蓝色线段连接两个中间点;共同的参数变化时,白点描绘出曲线。

伯恩斯坦权重表达同一种构造

查看原文 03:52

这种嵌套过程称为德卡斯特里奥算法。Holmér 喜欢它的数值稳定性,也觉得它容易记忆:不断对上一层的点做插值。把插值公式展开并按控制点合并,就得到等价的三次伯恩斯坦形式:

P(t) = (1 − t)³P0 + 3(1 − t)²tP1 + 3(1 − t)t²P2 + t³P3。

每个多项式都是对应控制点向量的权重。t 在 0 到 1 之间时,权重都非负且总和为 1:起点处第一个权重为 1,终点处最后一个权重为 1。加权求和与嵌套插值在同一个 t 上得到同一个点。

查看原图

在 05:03,画面中的展开系数正是以多项式形式写出的这些权重。Holmér 还在 RGB 颜色空间里使用三维贝塞尔曲线,混合这个可视化中的颜色。

导数描述路径的局部方向

查看原文 06:22

一阶导数 P′(t) 是位置对参数 t 的向量变化率。三次曲线的一阶导数本身是一条二次贝塞尔曲线,其控制向量为 3(P1 − P0)、3(P2 − P1) 和 3(P3 − P2)。再求一次导数得到一次曲线;三阶导数则是常向量。次数降低是贝塞尔曲线导数的一般性质。

Holmér 用速度、加速度和 jerk(加加速度)帮助理解这些逐阶导数。只有采用恰当的时间参数化时,这些名称才直接对应物理运动:如果 t 随时间变化,物理速度还取决于 t 变化得有多快。尤其是 P′(t) 本身并不自动代表每秒的速度。

在 P′(t) 非零处,将它归一化即可得到单位切线,即沿曲线的方向。平面例子中,将切线旋转 90 度可得到垂直的法线;沿法线偏移点,有助于围绕路径生成道路。零导数无法归一化;而在三维空间中,一个切线有多个垂直方向,因此构造道路坐标系还需要额外选择朝向。

查看原图

在 07:33,箭头展示局部导数的方向;左侧公式描述它如何随 t 变化。

曲率衡量路径如何转弯

查看原文 09:09

对于 P′(t) 非零的平面参数曲线,有符号曲率为 κ = det(P′, P″) / |P′|³。行列式反映一阶和二阶导数之间的关系,分母则考虑了参数的局部变化率。符号在选定方向约定下表示转弯方向,绝对值表示弯曲有多紧。

密切圆是在局部与曲线曲率相匹配的圆。通常所说的非负半径为 1 / |κ|;κ 的符号则表示转弯位于哪一侧。Holmér 的例子中,曲率经过零并改变符号,该处是拐点。曲率为零时没有有限的密切圆半径;导数为零时公式本身出现奇异,也就不能用这个计算式定义该处曲率。

查看原图

在 10:35,曲线颜色随着图中曲率的符号变化而改变。圆展示的是局部匹配,并非整条路径共用的半径。

极值点帮助求出紧包围盒

查看原文 10:56

包围盒包住曲线,可以在成本更高的精确相交测试之前,先快速排除不可能相交的对象。用所有控制点构造包围盒很容易,但盒子可能比实际曲线大得多。要找到紧密的轴对齐包围盒,可以分别考察 x(t) 和 y(t)。

三次曲线的每个坐标导数至多是二次式。求解 x′(t) = 0 和 y′(t) = 0,保留 [0, 1] 内的实根,在这些候选参数处以及两个端点计算曲线坐标。这些值中最小和最大的 x、y 就确定了包围盒。驻点只是候选点,不一定构成最终边界。如果导数退化为一次式或常数,应按相应的低次情况处理,不能一律套用二次求根公式。

查看原图

在 11:50,彩色点标出了曲线的坐标极值;即使端点没有作为内部极值高亮,也必须纳入比较。

一般情况下弧长需要近似

查看原文 14:03

弧长是沿路径测量的距离,而不是两点间的直线距离。一般三次贝塞尔曲线的弧长积分没有初等闭式解;某些特殊曲线则可以有更简单的精确长度。一种实用估计方法是按一系列 t 值采样,用线段连接相邻采样点,再把线段长度加起来。增加采样通常能改善近似,但也会增加计算量。

这对动画很重要:知道总长度,并不能直接告诉我们某个 t 对应曲线上的多远距离。

参数等间隔不能保证距离相等

查看原文 15:11

Holmér 先提出令 t = 距离 / 总长度。在最初的例子中,这似乎有效:走过总长度的一半,好像就到了 t = 0.5。随后她改变控制点,展示这个捷径失效。t 等量增加时,距离通常并不等量增加,因为 P′(t) 的大小可能沿曲线变化。因此,即使在相等时间里让 t 增加相同的量,物理速率也未必恒定。

查看原图

在 15:35,画面里的 t = 距离 / 弧长 是反例的铺垫,不是通用转换规则。这个特定形状让它在曲线改变之前看起来很可信。

查找表近似地把距离转换为 t

查看原文 17:06

选取一系列 t 值采样,把每个 t 与截至该点的累计线段长度一起存入表中。给定目标距离后,找到相邻的累计距离记录,在两者之间估计对应的 t,再用这个参数计算 P(t)。对等间隔距离重复这一过程,就能得到近似等间隔的位置;若距离随时间均匀增加,运动也会近似匀速。

查看原图

在 18:30,图表将采样参数映射到累计距离;变化的斜率直观展示了两者并非均匀对应。查找表是近似值,并非精确的反函数:采样分辨率会影响精度、存储和计算成本。这就是 Holmér 对弧长参数化的实用近似。

视频本身也由程序化动画制作

查看原文 19:26

Holmér 在结尾强调,贝塞尔曲线只是更大样条家族的一部分,后者还包括 B 样条。她说,在这部 2021 年作品中,除外部素材外的动画都由 Unity 制作,使用了自定义时间线、代码、她自己的 Maths 数学库和 Shapes 矢量图形插件。自制录制器导出 PNG 序列,再用 DaVinci Resolve 剪辑。这些是当时的视频制作流程,并不代表她现在使用的工具。