8.曲线、曲面
1、贝塞尔曲线(Bezier)
- 起始点为P0,t0表示P0处的切线
- 终点为P3,t1表示P3处的切线
- P1和P2表示了t0,t1的切线长度
问题:给定任意多个控制点,怎么画出贝塞尔曲线?
a)二次贝塞尔曲线
- 三个控制点,b0:起始点,b1:中间控制点,b2:终点
- 在一段时间0~1之间,对于每一个t时间点,标出在b0b1和b1b2线段相同比例的b10和b11
- 连接b10,b11,以b0,b20,b2做曲线,b20为相同比例t的的位置点
b)三次贝塞尔曲线
- 现在有b0,b1,b2,b3,四个点,b0:起始点,b1、b2:中间控制点,b3:终点
- 取四个点连接的三条线段b0b1,b1b2,b2b3,中相同比例t的点,得到b10,b11,b12
- 递归获得,b10b11,b11b12线段相同比例t的位置点,b20,b21
- 递归b20,b21,取相同比例t位置出的点,b30
- 链接点b0,b30,b3,做贝塞尔曲线
c)多阶贝塞尔曲线的总结
d)贝塞尔曲线的性质
- 必须过起点和终点
- 对于三阶贝塞尔曲线:起始位置的切线一定是3倍的(b1-b0)
- 在仿射变换下,可以对不同的顶点做仿射变换后再最相应的点做贝塞尔曲线,这跟原来顶点的贝塞尔曲线是一致的。(投影变换不适用该性质)
- 凸包性质,作出的贝塞尔曲线上任意一个点一定在这几个控制点所形成的凸包里面。

2、逐段贝塞尔曲线(Piecewise Bezier Curves)
对于高阶贝塞尔曲线它有一个严重的缺陷:
- 对于上图所示的由11个控制点所得到的10次贝塞尔曲线,由于控制点众多,很难控制局部的贝塞尔曲线形状
- 因此为了解决该问题,有人提出了分段贝塞尔曲线,即将一条高次曲线分成多条低次曲线的拼接,其中用的最多的便是用很多的3次曲线来拼接,如下图:

- 每一段的控制点为四个,一个起始点,一个终点,
- 两个中间控制点例如第一段的贝塞尔曲线的控制点为如下四个。

- 可以试玩下demo
问题:想要连接处光滑过度,如何处理
- 如果想要使得拼接的点看起来较为光滑的话,就要满足一些连续条件如一阶连续(连接点导数的左右极限相等),二阶连续等等。
- 即该点的左右两个蓝色控制点方向相反,长度一致。
3、另外的曲线
a)样条曲线
- 通过给定集合的连续曲线
- 并且具有一定数量的连续导数。
- 简而言之,一条受控曲线
b)b样条
- B样条曲线相对于贝塞尔曲线可以更好的进行局部控制
- NURBS曲线可以得到一些B样条曲线无法精准描述的圆锥曲线
4.贝塞尔曲面(Bézier Surfaces)

- 第1步 在这4个控制点之下利用第一个参数 u uu 运用第一章的计算贝塞尔曲线的方法得到蓝色点,因为有4列,所以一共可以得到如图所示的4个蓝色点。(灰色曲线分别为每列4个点所对应的贝塞尔曲线)
- 第2步 在得到4个蓝色顶点之后,在这四个蓝色顶点的基础之下利用第二个参数 v vv 便可以成功得出贝塞尔曲面上的正确一点
- 第3步 遍历所有的 u,v值就可以成功得到一个贝塞尔曲面
分类:
图形学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署