Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【图形学】贝塞尔与B样条曲线曲面笔记

【图形学】贝塞尔与B样条曲线曲面笔记

作者头像
ZifengHuang
发布于 2021-03-07 09:54:22
发布于 2021-03-07 09:54:22
5.3K0
举报
文章被收录于专栏:未竟东方白未竟东方白

概览

这篇文章是看中国农大的图形学公开课的笔记, 简单介绍了贝塞尔Bezier曲线曲面和B样条B-Spline曲线曲面, 希望能够带来一个大概视角和总览. 本文同步存于我的Github仓库, 字数长度3.2k(https://github.com/ZFhuang/Study-Notes/tree/main/Content/%E4%B8%93%E9%A1%B9%E7%AC%94%E8%AE%B0/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF%E6%9B%B2%E9%9D%A2).

学识尚浅, 内容有错漏在所难免, 如果发现问题希望大家在评论指出.

所谓样条指的是以前设计者所用的一系列形状固定的模具, 用于拼接绘制复杂的曲线. 样条曲线这个名字形象地表达出这种用多个有规律的多项式函数拼接拟合复杂曲线的方法, 并也最常用于设计行业.

参数曲线曲面和数学(P2~P8)

参数方程的优势

参数方程形如, 即由组成的一个有界点集, 其中t是参数, 样条曲线就常用参数方程表达, 有下面几个优势:

  1. 几何不变性: 只与点间相对位置有关, 与坐标系选择无关
  2. 自由度高: 每个维都有自己独立的方程, 因此可调整的参数比直接表达要多
  3. 可以通过直接调整参数方程来进行几何变换
  4. 方便处理斜率无穷大的情况
  5. 方便查找边缘, 可以归一化定义域
  6. 容易转为向量或矩阵形式来计算

参数方程中的曲线几何性质

  • 切向量:
  • 单位切向量:
  • 曲率: 对切向量再求导
  • 曲率半径: 曲率的导数
  • 法向量: 切向量T和副法向量B的叉乘
  • 挠率: 曲线的扭曲程度(离开密切面的程度), 与副法线的夹角在弦长上的导

光顺

插值和拟合都可以被称为逼近, 但是插值必须经过所有输入点, 样条曲线属于对输入点的拟合, 不会经过所有点.

描述曲线的平滑, 最好能够:

  1. 尽量高阶的连续性
  2. 没有多余的拐点和奇异点
  3. 曲率变化较小

曲线连续性

参数连续性:

  • 0阶连续性, 判断处的两端点的值相同
  • 1阶连续性, 判断处的两端一阶导相同
  • 2阶连续性, 判断处的两端二阶导相同...

几何连续性:

  • 0阶连续性, 判断处的两端点的值相同
  • 1阶连续性, 判断处的两端一阶导成比例
  • 2阶连续性, 判断处的两端二阶导成比例...

参数曲线插值

两点间有无数种插值方法, 使用不同的参数方程和参数化会插值出不同的值

  • 节点: 每个待得的参数值
  • 型值点: 已有的点
  • 参数分割: 参数域上决定的一种节点取值的分割
  • 参数化: 对一组型值点确定出来的参数分割
  • 均匀参数化: 在参数轴上等距分割
  • 累加弦长参数化: 根据线的长度分割
  • 向心参数化: 用线与某点之间的转角角度

贝塞尔曲线(P9~P17)

定义

贝塞尔曲线, 是后面B样条曲线的一种特例, 属于几何形式的参数化曲线, 目的是输入一系列有序的控制点组成特征多边形, 然后是对特征多边形进行逼近得到光滑曲线. 公式如下

其中是伯恩斯坦基函数, 实际上是的牛顿二项式展开形式, 具体公式如下:

一次的贝塞尔曲线由两个控制点组成, 展开后相当于两点间的线性插值, 二次贝塞尔曲线相当于抛物线插值等等...

伯恩斯坦基函数性质

  1. 非负性:
  2. 权性: 所有基函数在当前参数上的值的和为1
  3. 端点性: ,
  4. 对称性: 顶点顺序反向则形状不变, 曲线方向反向
  5. 递推性: n次的B可由两个n-1次的B线性组合得到
  6. 导函数:
  7. 最大值: 处最大
  8. 积分:
  9. 凸包: 曲线落在控制点产生的凸包中, 使得控制点重合或共线时也能正常计算

贝塞尔曲线性质

  1. 端点性: 曲线只会经过头尾两个端点
  2. 导函数: 曲线的起点与终点的切线和第一与倒数第一条特征线一致
  3. 几何不变: 曲线形状只与点的相对位置有关
  4. 变差缩减: 面上任一直线与曲线的交点个数不多于此直线与曲线的特征多边形产生的交点个数, 意味着曲线比多边形更光顺

绘制贝塞尔曲线

代入法: 直接用定义式来绘制, 计算复杂

递推法: 由于n次的B可由两个n-1次的B线性组合得到, 一次的贝塞尔曲线由两个控制点组成, 展开后相当于两点间的线性插值, 所以二次的贝塞尔曲线是由三个控制点, 这三个控制点按顺序连成两个线段, 各自进行对应参数的线性插值, 然后得到的两个新点连成新的线段, 在线段上同样线性插值得到. 高次的贝塞尔曲线就是不断插值得到. 写为递推式:

绘制示意图如下:

分段贝塞尔曲线

即便迭代法可以大大加快贝塞尔曲线的绘制, 但是绘制高次贝塞尔曲线仍然很大, 且由于贝塞尔曲线是由作用域在整个定义域上的大量基函数线性组合得到, 因此高次的贝塞尔曲线会由于组合过于复杂而很不稳定且难以控制, 因此实际中常常通过多个不高于4次的小段贝塞尔曲线组合得到整个曲线.

组合分段曲线要注意头尾拼接的问题, 常用的拼接需要满足连续性, 由于贝塞尔曲线曲线的起点与终点的切线和第一与倒数第一条特征线一致, 因此只要保证连接的两段贝塞尔曲线的连接点和相邻两点形成的三点共线即可.

升阶和降阶

升阶就是增加曲线控制点的数量而不改变曲线形状, 下面的定义式可以计算出可以在i处插入的新控制点的位置, 顶点越多, 形成的特征多边形就会越逼近实际曲线:

降阶则是在尽量不改变曲线形状的情况下减少控制点的数量, 这是个比较复杂的问题, 下面的递推式是一种比较简单的方法:

贝塞尔曲面(P18~P20)

贝塞尔曲面定义

贝塞尔曲面实际上是贝塞尔曲线的扩展, 将特征多边形增加一个维度变为特征网格, 然后同样是利用线性组合得到所需的点. 定义式如下:

函数B仍然是伯恩斯坦基函数. 曲面由四角的四个角点和角点组成的四条边界线构成.

贝塞尔曲面性质

  1. 曲面必过四个角点
  2. 最外的一圈点决定了曲面的边界
  3. 和贝塞尔曲线一样有几何不变性, 对称性, 凸包性等...
  4. 顶点过多时也会产生波动且计算复杂
  5. 复杂的贝塞尔曲面也是由多段拼接得到的, 通常使用不超过4次的子曲面拼接
  6. 拼接算法比曲线复杂
  7. 也有递推性, 可以递推绘制
  8. 同样不能局部修改, 牵一发而动全身

绘制贝塞尔曲面

除了使用定义法绘制外, 常用方法同样是递推法. 曲面是曲线在不同维度上的线性组合得到的, 核心思想是依次插值每个轴, 逐步缩小范围. 以先u再v为例, 首先在每个拥有参数分割的v上, 固定v不变, 得到一串串控制点, 对这些计算贝塞尔曲线, 得到一系列对应输入u新的点. 得到的这一系列点再对参数v进行贝塞尔曲线计算, 这样迭代到只有一个点时这个点就是曲面对应的点.

实际上这个递推就是如下在定义式上加个优先级约束从而将曲面计算转为递推的曲线计算而已:

B样条曲线(P21~P26)

B样条曲线定义

B样条曲线实际上是对贝塞尔曲线的扩展, B指Basic, 或者说贝塞尔曲线是B样条曲线的特例, B样条曲线通过一系列范围有限的基函数组合来解决贝塞尔曲线牵一发而动全身的缺点. 其定义式和贝塞尔曲线相似:

B样条曲线的核心是其基函数, 称为k阶(k-1次)基函数. 这也是有递推性的基函数, 定义如下, 这里还要注意到基函数的作用域变小了, 有限的作用域使得计算复杂度降低且更稳定:

B样条曲线性质

  1. 局部性: 一个控制点的作用范围只能影响k个点, 这是B样条改进的核心
  2. 其它的变差缩减性, 几何不变性, 凸包性和贝塞尔曲线一样

B基函数性质

  1. 局部支撑性: 各个基函数只在对应小区间上对曲线有影响
  2. 权性: 区间内权和为1
  3. 连续性: r重节点处连续性不低于k-1-r, 只有当节点处包含了足够多的基函数时才满足连续性
  4. 分段多项式: 计算快, 稳定, 容易修改

B基函数的示意图:

绘制B样条曲线

如果将这个绘制出来的话, 一阶的B样条是两个节点组成的一个区间, 区间本身就是值为1的常函数. 插值的核心发生于大于1阶的时候加入的这个线性插值系数, 这个参数使得常函数被折为折线, 再形成三阶的抛物线...具体绘制的方法就是利用这个线性插值系数得到递推的点, 总体上和贝塞尔曲线的绘制是一样的.

几种B样条曲线

  1. 均匀B样条曲线: 指的是参数轴形如(0,1,2,3,4)均匀分割, 这会使得基函数呈周期性, 后续的基函数只是前面基函数在新位置上的重复, 这种情况下曲线不一定经过两个端点
  2. 准均匀B样条曲线: 两端节点有k重复度形如(0,0,0,1,2,3,4,4,4), 使得曲线必然经过两个端点
  3. 分段贝塞尔曲线: 两端处有k重复度, 同时内部节点有k-1的重复度
  4. 非均匀B样条曲线: 是不等距的分割, 这会使得不是常数, 这种B样条曲线能够更加自由的使用, 其中限制除法结果必须是有理数的非均匀有理B样条(NURBS)由于计算代价较小而使用自由因此在设计行业中广为使用

B样条曲面(P27)

定义式如下, 构造方法原理与贝塞尔曲面相同:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未竟东方白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【笔记】《计算机图形学》(15)——曲线
这一章介绍了曲线的表示, 用到了比较多的数学. 前半部分主要是介绍了曲线的性质和表示方式, 并介绍了多项式插值曲线, 后半部分主要介绍了包括贝塞尔曲线和B样条曲线在内的拟合曲线. 样条曲线的内容在样条曲线曲面有过一些简单的介绍, 这一章没有介绍曲面部分, 但是在曲线部分则进行了更加详细的介绍, 我也对这部分有了更好的理解.
ZifengHuang
2021/06/29
3K0
B样条曲线
B样条曲线广泛应用于车辆以及航空航天等工业领域,例如:自动驾驶汽车路径规划时为了使得汽车运行平稳,需要使得运行路径的二阶导数连续(目前,AGV小车主要是通过直线和圆弧进行路径规划,由于两个阶段加速度不一致,因此在进行直线与圆弧转换过程中存在抖动问题),经常需要用到B样条曲线;其次,B样条曲线广泛应用于飞行器表面的描述。曲线的平滑处理包含近似拟合(曲线不经过点)以及插值拟合(曲线经过点)两种,在此进行简要分析。
联远智维
2022/01/20
1.5K0
B样条曲线
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
读到这篇小文的朋友:新年好!今天我们将在本文中简单探索一个结合Wolfram语言的神经网络与B样条功能的有趣问题。
WolframChina
2021/03/15
1.8K0
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
模拟试题B
1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( )
步行者08
2018/10/09
4.3K2
Python+Matplotlib绘制三次B样条曲线基函数图像
在计算机图形学课程中,B样条曲线属于重要教学内容之一。已知,m+n+1个控制点可以确定m+1段光滑拼接的n次B样条曲线,其中第i段(i=0,1,2,...,m)曲线上点的定义为
Python小屋屋主
2023/08/29
5710
Python+Matplotlib绘制三次B样条曲线基函数图像
用OpenGL进行曲线、曲面的绘制
实验目的 1)理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。 2)掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异; 代码1:用四个控制点绘制一条三次Bezier曲线 #include "stdafx.h" #include <stdlib.h> #include <time.h> #include <GL/glut.h> //4个控制点的3D坐标——z坐标全为0 GLfloat ctrlpoints[4][3] = { { -4, -
Zoctopus
2018/06/04
3.2K0
可视化图表实现揭秘
1. 介绍 1.1 什么是数据可视化? 可视化是利用计算机图形学和图像处理技术,将数据转换成图形或者图像在屏幕上显示出来,再进行交互处理的理论、方法和技术。 数据可视化并不是简单的将数据变成图表,而是以数据为视角,看待世界。数据可视化就是将抽象概念形象化表达,将抽象语言具体化的过程。 1.2 为什么要用数据可视化 首先我们利用视觉获取的信息量绝对远远的比别的感官要多得多。 它能帮助分析的人对数据有更全面的认识,下面举个🌰 我们看下面几组数据: 对数据进行简单的数据分析,每组数据都有两个变量 X 和 Y,然
用户1097444
2022/06/29
1.2K0
可视化图表实现揭秘
Python+OpenGL绘制任意长度和次数的B样条曲线
对于给定的m+n+1个控制点,可以绘制m+1段光滑拼接的n次B样条曲线,每段曲线上点的位置由n+1个控制点决定,其中第i段曲线上参数t(0<=t<=1)对应的点为
Python小屋屋主
2022/06/05
1K0
Python+OpenGL绘制任意长度和次数的B样条曲线
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
确定一条n次贝塞尔曲线需要n+1个控制点和n+1个对应的调和函数,每个调和函数的定义域和值域都为[0,1],且所有调和函数值之和恒等于1,与自变量取值无关。以三次贝塞尔曲线为例,需要4个控制点(记为P1、P2、P3、P4),相应的4个调和函数的表达式分别为:
Python小屋屋主
2022/06/05
9580
Python+Matplotlib可视化三次贝塞尔曲线的4个调和函数
实验11 B样条曲面生成
求值器能够描述任何角度的多项式或有理多项式样条或表面,包括B-样条,NURBS(非均匀有理B-样条)表面,Bezier曲线和表面,以及Hermite样条。由于求值器只提供了对曲线或表面底层描述,需要使用更高层次的NURBS接口来生成B样条曲面。 OpenGL提供了NURBS接口,该接口封装了大量代码,不仅包含渲染功能,也提供了修剪曲面等额外功能,NURBS函数使用平面多边形进行渲染。B样条曲面包含非均匀有理B-样条,另外Bezier的缺点是增加很多控制点时曲线变得不可控,而B样条曲面调整4个控制点可以得到较好的效果。 NURBS接口生成B样条曲面的过程如下。 (1)生成控制点和创建NURBS对象:
步行者08
2020/10/29
1.8K0
实验11 B样条曲面生成
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
我们有 p1(锚点 1)、cp1(控制点 1)、cp2(控制点 2)、p2(锚点 2) 表示的一条三阶贝塞尔曲线,给定曲线参数 t,求其对应的点位置,以及这个点的切向量和法向量。
前端西瓜哥
2024/07/31
6460
贝塞尔曲线算法:求 t 在三阶贝塞尔曲线上的点、切向量、法向量
Python+OpenGL绘制沿B样条曲线运动的红色小球
任务描述: 绘制多条B样条曲线以及一个沿曲线运动的红色小球,具体功能有: 1)按1、2、3键可以切换1次B样条曲线、2次B样条曲线、3次B样条曲线; 2)鼠标左键选择一个控制点后按delete键可以
Python小屋屋主
2023/08/29
4190
Python+OpenGL绘制沿B样条曲线运动的红色小球
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的、碰撞避免的行驶路径和舒适的运动速度。生成行驶路径最经典方法之一就是是Sampling-Based Planner算法;基于采样的规划器可以规划出可行的轨迹,但这种轨迹往往是折线,为了保证车辆行驶过程中给乘客良好舒适的体验,需要对规划的轨迹进行平滑。Cubic Spline就是一种常用的插值平滑算法,通过一系列的控制点得到一条连续平滑的轨迹。
YoungTimes
2022/04/28
2.2K0
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
  RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理学公式手动计算位置和物体速度的方式实现,现在这个版本中使用的是DoTween+贝塞尔曲线调节来实现。(关于它们之间的各种优缺点我们会在以后单独开一篇博客来探讨,届时也会放出源代码互相学习下)好了,言归正传,今天马三就来和大家一起学习一下游戏中的贝塞尔曲线以及其在Unity中如何实现。
马三小伙儿
2018/09/12
4.5K0
【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
贝塞尔曲线方程---插值算法的完美解释(附matlab完整代码)
下面的这个就是鸢尾花里面的二阶贝塞尔曲线,有三个控制点组成,以此类推,n阶的贝塞尔曲线有n+1个点组成的;
阑梦清川
2025/02/24
2480
贝塞尔曲线方程---插值算法的完美解释(附matlab完整代码)
图形学复习
​ 令 \Delta_{1} = 2a,\Delta_{2} = 2(a+b) ;
努力的Greatiga
2022/07/25
1.8K0
【笔记】《计算机图形学》(16)——计算机动画
这一章介绍了计算机动画相关的内容, 主要介绍了动画的基本概念, 动画之间的插值, 几何变形, 角色动画, 物理动画, 生成式动画和对象组动画这几个领域, 这些领域书中都只介绍了最基础的内容, 想要深入了解某个领域的话必须阅读其它资料.
ZifengHuang
2021/07/23
1.8K0
【笔记】《计算机图形学》(16)——计算机动画
Android之贝赛尔曲线及其应用场景
导语 本文对贝赛尔曲线的公式及推导过程进行了深入学习,同时结合网上的资料,整理了一些其常用的应用场景。 前段时间做送礼动画需求的时候遇到送礼轨迹需要平滑的要求,因此对常用的平滑轨迹贝赛尔曲线进行了
MelonTeam
2018/01/04
1.8K0
Android之贝赛尔曲线及其应用场景
【GAMES101】Lecture 11 贝塞尔曲线
很早之前说过的这种矢量图是不会随着放大而失真的,像这种字体,就是用了逐段的三次贝塞尔曲线实现的
叶茂林
2024/01/29
2170
【GAMES101】Lecture 11 贝塞尔曲线
贝塞尔曲线
贝塞尔曲线 (Bézier Curve) 是由法国工程师皮埃尔·贝兹 (Pierre Bézier) 于 1962 年所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计 1。贝塞尔曲线最初由保尔·德·卡斯特里奥 (Paul de Casteljau) 于 1959 年运用德卡斯特里奥算法 (De Casteljau’s Algorithm) 开发,以稳定数值的方法求出贝塞尔曲线。
为为为什么
2024/09/20
1690
贝塞尔曲线
推荐阅读
相关推荐
【笔记】《计算机图形学》(15)——曲线
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档