Bezier曲线(显示表达)
定义
[13:24] 用一系列控制点定义曲线
例如定义这样一组控制点:
要求所生成的曲线满足这样的性质:
- 起始点同p0位置
- 起点处的切线方向同→p0p1
- 终点同为p3位置
- 终点处的切线方向同→p2p3
de Casteliau算法
根据给定点序列画Bezier曲线
给定3个点,画Bezier曲线
把起点看作是t=0时刻,终点看作是t=1时刻,画Bezier曲线,相当于求t=[0,1]区间时pt所在的位置。把范围所有时刻的pt连起来就是Bezier曲线。
- 算出b0b1中的t位置的点为b10
- 算出b1b2中的t位置的点为b11
- ab连成一条线,算是ab中的t位置的点为b20
- b20是 Pt 的位置,
给定4个点,画Bezier曲线
[23:24]
Bezier曲线的代数表示
推导过程省略,最后的结论是:
bn(t)=bn0(t)=n∑j=0bjBnj(t)
- bn(t) 表示最终结果,在Bezier曲线上t时刻的点的位置。
- bn0(t)的上标n表示这个点在第n层线段上的点。初始控制点组成的线段为第0层。第n层为最后一层。下标0代表这一层的第0个线段。由于第n层只有一个线段,因此下标只能是0。bn0(t)是第n层的线段上的t时刻的点,其实就是对应最终结果了。
- bj 是初始控制点,也可以表示为bn0(0)及bn0(1),其实是第0层的上一层。
- 从公式可以看出,bn(t) 是一组控制点的线性组合,组合的系数是B,即与t有关的多项式
✅ 以上公式对3D控制点同样适用
Berstein多项式
Bnj(t)=(n j)tj(1−t)n−j
性质
- 在给4个控制点的情况下,b(0)的切线方向为3(b1−b0),b(1)的切线方向为3(b3−b2)。
❓ 问:为什么会有系数3?既然是方向,3(b1−b0)和(b1−b0)都是同一个方向。
答:(来自弹幕)切线也是有值的,值越大原来曲线变得越快。
-
用控制点画出曲线,再把曲线做仿射变换 = 对控制点做仿射变换,用变换后的点画曲线
-
画出的曲线,一定在控制点形成的凸包内。
Piece-wise Bezier曲线
- Why
[38:23] 当控制点比较多时,Bezier曲线不利于控制
- How
把多个点分段,每4个点画一条曲线,例如photoshop中的钢笔功能。
- What
光滑的Piece-wise Bezier曲线
C0连续:数值上连续
C1连续:切线连续(方向和大小都要一致),即光滑
C2连续:曲率连续
要使分段的Bezier曲线光滑(C1连续),需要让上一段的终点和下一段的起点切线一致。这可以通过控制点的位置来实现。
Splint 样条
定义: 一条曲线,由一系列控制点来控制,且满足一定的连续性
B-spines
B: basis,基函数,即与以一定方式将基函数组合,得到一个复杂函数
局部性:移动一个控制点,只在一定范围内影响这个曲线
(这个内容比较复杂,本课不展开了)
本文出自CaterpillarStudyGroup,转载请注明出处。
https://caterpillarstudygroup.github.io/GAMES101_mdbook/