贝塞尔曲线与曲面
对于直线段与平面,我们只要有它们的端点就可以绘制与填充,但是对于曲线和曲面,绘制起来就困难得多。
在这篇文章中,我将介绍一种经典的曲线曲面表示方法——贝塞尔曲线与贝塞尔曲面。
贝塞尔曲线
贝塞尔曲线(Bézier Curve)是计算机图形学中用于平滑过渡、绘制曲线的核心工具。无论是你在 PhotoShop 里用的钢笔工具,还是前端开发中的 CSS 缓动动画,亦或是各种游戏引擎中的角色路径,背后全都是它。
简单来说,它的本质就是:通过极少数的控制点,利用”线性插值”的原理,勾勒出一条连续且平滑的曲线。
贝塞尔曲线的分类与原理
贝塞尔曲线的”阶数”取决于你给它多少个控制点。控制点越多,曲线的形态就越复杂。
一阶贝塞尔曲线(线性插值)
控制点:2 个点(起点
,终点 ) 原理:其实就是一条直线。随着时间
从 0 匀速运动到 1,动点在一阶曲线上做简单的线性插值。 数学公式:
二阶贝塞尔曲线(二次方)
控制点:3 个点(起点
,控制点 ,终点 ) 原理:这是最直观展示其动态生成过程的阶数。
在
连线上,有一个动点 在按比例 前进; 同时,在
连线上,也有一个动点 在以相同的比例 前进; 连接
,再在 这条移动的线段上,按同样的比例 取一个动点 。这个 的运动轨迹,就是二阶贝塞尔曲线。
数学公式:
三阶贝塞尔曲线(三次方)
控制点:4 个点(起点
,控制点 、 ,终点 ) 应用:这是工程中最常用的一种。钢笔工具、矢量字体的字形描述(如 TrueType 字体)、CSS 中的
cubic-bezier缓动函数都是它。它在二阶的基础上又叠加了一层线段插值。数学公式:
更高阶的贝塞尔曲线
控制点:阶数 + 1(起点,终点,以及其他控制点)
应用:由于更高阶的贝塞尔曲线的局部控制能力会变弱,且计算开销变大,工程上很少直接使用高阶贝塞尔曲线。对于复杂的曲线,通常会使用多段三阶贝塞尔曲线进行拼接。
直观演示
下面我们以二阶贝塞尔曲线为例,直观感受一下贝塞尔曲线的绘制过程。
第一步: 确定三个控制点——起点
第二步: 在线段
对于同一个插值系数
第三步: 连接两个中间点,在这条新线段上再次按比例
不断重复第二、三步(即令
对于更高阶的贝塞尔曲线,原理是一样的,只不过每一层都需要在更多相邻控制点之间迭代插值,直到最终收敛为一个点。这种层层递推的过程就是 De Casteljau 算法的几何直观。
下面还有一个交互式可视化工具,可以更直观地感受贝塞尔曲线的绘制过程:
贝塞尔曲线公式推导
贝塞尔曲线的推导其实是一个”两面一体”的过程:它的几何构建使用的是 De Casteljau(德卡斯特里奥)递推算法,而它的代数本质展现出来就是伯恩斯坦多项式(Bernstein Polynomials)。
前面我们已经通过 De Casteljau 算法演示了贝塞尔曲线的几何绘制过程,下面我们以二阶贝塞尔曲线为例,从几何递推出其代数公式。
二阶贝塞尔曲线由三个点
1. 第一层插值: - 在线段
2. 第二层插值: -
连接这两个新产生的点,得到一根动态移动的线段
3. 代数展开: - 将第一层的结果代入第二层:
这就是二阶贝塞尔曲线的代数形式。
通过类似的方法,我们可以推导出所有阶数的贝塞尔曲线公式:
- 一阶:
- 二阶:
- 三阶:
更一般地,
其中
我们来观察一阶、二阶、三阶展开后的各项系数:
- 一阶:
- 二阶:
- 三阶:
可以发现,这些系数恰好对应二项式展开式
将
这当中展开出来的每一个独立单项,在数学上被定义为
伯恩斯坦基函数有两个关键性质:
- 非负性:对于
,有 。 - 单位分解性(Partition of Unity):
。
通过上面的几何递推和代数模式匹配,我们可以得出结论:
通用的贝塞尔曲线显式公式为:
这是一个非常优美的结果——几何上的层层插值(De Casteljau),在代数上等价于伯恩斯坦基函数的线性组合。
贝塞尔曲线的核心特性
贝塞尔曲线之所以能成为计算机图形学、字体设计以及工业 CAD 建模的基石,是因为它具备一系列极其完美的数学与几何特性:
1. 端点内插性(Endpoint Interpolation)
曲线严格经过起点和终点。
- 数学表达:对于
阶贝塞尔曲线 ,当 时,曲线必定位于起点 ;当 时,曲线必定位于终点 。 - 工程价值:这让多段曲线的拼接变得非常直观——只要让前一段的终点和后一段的起点坐标重合,就能实现无缝首尾相连(即
连续)。
2. 端点切线方向性(Endpoint Tangents)
曲线在起点和终点处的切线方向,严格由前两个点和后两个点决定。
- 具体表现:
- 在起点
处的切线矢量方向严格与控制边 相同。 - 在终点
处的切线矢量方向严格与控制边 相同。
- 在起点
- 交互价值:这就是矢量设计软件(如
Photoshop、Illustrator)中“钢笔工具手柄”的数学本质。手柄的方向决定了曲线飞离端点的角度,手柄的长度(控制点的距离)则决定了拉扯力的大小。此外,若要让两段贝塞尔曲线在拼接点处实现光滑过渡(
连续),只需保证前一段的 与后一段的 共线且同向即可。
3. 凸包性(Convex Hull Property)
整条贝塞尔曲线完全被包裹在所有控制点所围成的最小凸多边形(凸包)内部。
- 数学本质:由于伯恩斯坦基函数的非负性与单位分解性(各项系数之和恒为 1),曲线本质上是控制点的凸组合(Convex Combination)。凸组合的结果永远不可能超出控制点的凸包范围。
- 工程价值(简化碰撞检测):在游戏引擎、自动驾驶路径规划或 CAD 渲染中,判断一条贝塞尔曲线是否撞击障碍物时,算法不需要计算曲线上成百上千个采样点。它只需要先判断控制点围成的凸多边形是否与障碍物相交——如果凸包未相交,则曲线绝对安全。这是一种非常高效的剔除(Culling)策略。
4. 仿射不变性(Affine Invariance)
对贝塞尔曲线进行旋转、平移、缩放、错切等仿射变换时,不需要先算出曲线上每一个高密度采样点的坐标再去进行变换。
- 操作方法:只需要直接对那几个离散的控制点
进行矩阵变换,然后用变换后的新控制点直接生成新曲线,其结果与对整条曲线逐点变换完全等价。 - 工程价值:这大幅节省了浮点数几何计算,使得图形引擎在实时处理曲线旋转、缩放等动画时运行飞快。
5. 变差缩减性(Variation Diminishing Property)
任意一条直线与贝塞尔曲线的交点个数,绝不会超过这条直线与该曲线控制多边形(由控制点顺次连接成的折线段)的交点个数。
- 通俗理解:曲线比它的控制多边形还要”平顺”和”规矩”。如果控制多边形没有来回剧烈抖动,曲线本身就绝对不会无故折返或产生多余的波浪。
- 设计价值:它保证了曲线的视觉可控性——曲线表现得永远比控制点更温顺,绝对不会出现设计师预料之外的莫名鼓包或尖角。
6. 几何对称性(Symmetry)
如果你把控制点的顺序完全颠倒过来(即把终点
- 数学表达:由控制点序列
在参数 处生成的点,与由反向序列 在参数 处生成的点完全重合。只是随着时间推移,点的运动轨迹方向相反了而已。
贝塞尔曲面
把贝塞尔曲线从一维的空间曲线,拉伸拓宽到二维的空间曲面,就得到了贝塞尔曲面(Bézier Surface)。
基本思想
贝塞尔曲面的生成思路和贝塞尔曲线一脉相承——同样是”层层插值”。只不过,曲线只需要在一条线上来回插值,而曲面需要在一个控制点网格的
具体来说:先沿
这种在两个方向上反复插值的做法,本质上和贝塞尔曲线里”在一根动态线段上再插值”是同一回事,只是多了一个维度。
工程应用
在实际工程中,最常用的是由
贝塞尔曲线的大多数优良性质(端点内插性、凸包性、仿射不变性等)在曲面上同样成立,这使得贝塞尔曲面在工业设计(如汽车车身建模)、三维动画(如角色曲面建模)以及 CAD/CAM 系统中得到了广泛应用。
总结
- 贝塞尔曲线通过 De Casteljau 递推算法(层层线性插值)构建,其代数本质是伯恩斯坦基函数的线性组合。它具备端点内插性、凸包性、仿射不变性等优良特性,是矢量图形、字体设计与动画曲线的基础。
- 贝塞尔曲面是贝塞尔曲线在二维上的自然延伸——在控制点网格上沿两个方向分别做贝塞尔插值即可生成曲面,在工业建模与三维动画中应用广泛。
这次的插图来自画师 Fangpe
图片地址:https://www.pixiv.net/artworks/143019582