路径不仅仅是一条形状
查看原文 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极值点帮助求出紧包围盒
查看原文 10:56包围盒包住曲线,可以在成本更高的精确相交测试之前,先快速排除不可能相交的对象。用所有控制点构造包围盒很容易,但盒子可能比实际曲线大得多。要找到紧密的轴对齐包围盒,可以分别考察 x(t) 和 y(t)。
三次曲线的每个坐标导数至多是二次式。求解 x′(t) = 0 和 y′(t) = 0,保留 [0, 1] 内的实根,在这些候选参数处以及两个端点计算曲线坐标。这些值中最小和最大的 x、y 就确定了包围盒。驻点只是候选点,不一定构成最终边界。如果导数退化为一次式或常数,应按相应的低次情况处理,不能一律套用二次求根公式。
在 11:50,彩色点标出了曲线的坐标极值;即使端点没有作为内部极值高亮,也必须纳入比较。
一般情况下弧长需要近似
查看原文 14:03弧长是沿路径测量的距离,而不是两点间的直线距离。一般三次贝塞尔曲线的弧长积分没有初等闭式解;某些特殊曲线则可以有更简单的精确长度。一种实用估计方法是按一系列 t 值采样,用线段连接相邻采样点,再把线段长度加起来。增加采样通常能改善近似,但也会增加计算量。
这对动画很重要:知道总长度,并不能直接告诉我们某个 t 对应曲线上的多远距离。
参数等间隔不能保证距离相等
查看原文 15:11查找表近似地把距离转换为 t
查看原文 17:06视频本身也由程序化动画制作
查看原文 19:26Holmér 在结尾强调,贝塞尔曲线只是更大样条家族的一部分,后者还包括 B 样条。她说,在这部 2021 年作品中,除外部素材外的动画都由 Unity 制作,使用了自定义时间线、代码、她自己的 Maths 数学库和 Shapes 矢量图形插件。自制录制器导出 PNG 序列,再用 DaVinci Resolve 剪辑。这些是当时的视频制作流程,并不代表她现在使用的工具。