前言

本学期学院安排了参数化的课程,本觉得可能不会讲软件原理部分而是直接上手实操,没想到马老师准备得非常充分,从Rhino的核心Nurbs曲线讲起,正巧之前自学时也产生了一些疑惑,例如对阶数 控制点 节点 关系等的理解,只是会用但并不知其背后的原理,故借此机会来做个整理以便于自己后续的学习理解

ps:看了好多教程不由得感叹,数学是一切学科的基础

贝塞尔(Bézier)曲线

样条曲线的产生来源于生产实践,以前造船工人想要建立船身的曲线,往往会将一个极富弹性的钢条夹在压铁之间,调整压铁的位置,使其通过特定的限制点。

钢条在压铁的作用下因受力而产生弯曲变形,便得到一条十分光滑的曲线,这便是样条曲线最早期的概念

但这样的样条曲线是借助于各种物理手段得到的,无法精确复刻。如何将一段曲线抽象成一个数学模型

于是在1962年,一个叫皮埃尔·贝塞尔(Pierre Bézier)的法国工程师在设计汽车造型时,研究了一种矢量绘制曲线的方法,并给出了详细的计算公式

贝塞尔曲线的一大优点就是只需要很少的控制点就能够生成复杂的平滑曲线

贝塞尔曲线由两个端点和若干个控制点组成,通过改变控制点位置就可以改变整条曲线的形状

N个控制点对应着N-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制

特性

1、贝塞尔曲线是一段开始于P0并结束于Pn的曲线,具有端点插值法属性

2、贝塞尔曲线是直线的充分必要条件是所有控制点都共线。

3、贝塞尔曲线可在任意点切割成多条子曲线,每一条子曲线仍是贝塞尔曲线。

4、一些简单的曲线(如圆、椭圆、双曲线等)无法通过贝塞尔曲线精确描述,只能用分段贝塞尔曲线近似拟合。

5、对于给定的贝塞尔曲线,无法作固定数值的偏移,即偏移后的曲线无法用贝塞尔曲线精确的描述。

6、改变贝塞尔曲线的任意一个控制点,都会改变曲线的形状。

7、对于复杂的曲线,如果想仅用一段贝塞尔曲线获得目标曲线,就需要通过增加控制点来进行插值。

两个重要特性

  • 一是曲线的阶数=控制点个数-1,想要增加更多控制点进行插值,就需要更复杂的计算
  • 二是牵一发而动全身,移动一个控制点,整段曲线的形状都会改变

NURBS曲线

为了克服上述贝塞尔曲线的缺点,B样条曲线就应运而生了

NURBS是非均匀有理B样条(Non-Uniform Rational B-Splines)的缩写。

1991年,国际标准化组织(ISO)颁布的工业产品数据交换标准STEP中,把NURBS作为定义工业产品几何形状的唯一数学方法

B-Splines(B样条):

B样条,也叫基样条,是Basis-Splines的缩写,它是贝塞尔曲线的一般化

B样条可以指定阶数,增加任意数量的控制点,并通过节点对曲线分段,解决了贝塞尔曲线无法局部修改的问题。

B样条的解决方案是通过将一段段贝塞尔曲线拼成一条完整的多段曲线实现的

但B样条是低级别的多项式样条的集合,仍然无法绘制圆、椭圆、双曲线等类型的曲线。

为了适应更复杂的曲线,最后从B样条又引申出了NURBS样条

NURBS曲线:

阶数(Degree)

这里的阶数与贝塞尔曲线的阶数是一个概念,即多项式系数的最高次幂

从数学的角度看,阶数是多项式中影响力最大的因素,直接决定了曲线的性质。

从NURBS建模的角度看,阶数是曲线的一段跨距内(起点和终点之间),最大可弯曲的次数

曲线的次数越高,需要的计算就越复杂。

节点(Knot)

B样条是把贝塞尔曲线拼接起来的多段曲线。

也就是说人为的把目标曲线分为若干个区段,区段与区段交接的部分就叫节点

目的是尽量使得各个部分有所影响但也有一定独立性。

这也是为什么在B样条中,有时一个控制点的改变,不会影响到整条曲线,而只影响到局部的原因。

节点划分影响到权重计算,实现局部性影响的原理应该是在生成某区间内的点时,某些控制点前的权重值会为0,即对该点没有贡献,所以才有上述特点。

控制点(CV,Control Vertex)

即控制曲线的点,全部位于曲线之外,与贝塞尔曲线的控制点概念相同。

但不同的是B样条多项式的阶数可独立于控制点数目

例如3阶贝塞尔曲线有且只有4个控制点,但3阶B样条曲线可以有无数个控制点(前提是不能少于4个),因为B样条曲线可以叠加多个贝塞尔曲线

控制点的权值

控制点的权值是控制点对曲线或曲面的牵引力。

权值越高,曲线或曲面会越接近控制点。本质上是改变了该控制点前面的系数。

控制点与编辑点(EP,EditPoint)的关系

编辑点全部位于曲线之上,并且编辑点的数量=控制点的数量。编辑点是通过计算节点平均值得到的。

例如一个3阶曲线的节点向量为(0, 0, 0, 1, 2, 3, 3, 3),那么其编辑点的向量为(0, 1/3, 1, 2, 8/3, 3)【个人理解是每三个数取一个平均值】,所以编辑点可能与节点重合

编辑点和控制点一样都可以改变曲线的形状,但移动一个编辑点会影响整条曲线的形状,而移动一个控制点只会改变一部分曲线的形状。

当需要曲线上某一点精确通过某一特定位置时,编辑点的优势就体现出来了。

其中需要说明的是,曲线的两个端点(起始点和终止点),同样也是曲线的控制点、编辑点和节点。

控制点与节点、阶数之间的数量关系:

在B样条曲线中,控制点数量=内部节点数量(不包括两个端点)+阶数+1

当曲线内部节点为0时,则为最简曲线,即退化为贝塞尔曲线,此时其控制点数量=阶数+1

所以在进行Rhino建模时,尽量使用最简曲线,这样通过曲线生成的曲面质量最高,也方便后期的修改。

Rational(有理):

有了刚刚对控制点权值概念的铺垫,“有理”这个概念就更容易理解了。

曲线是否有理,取决于曲线上控制点的「权值」是否相等。

  • 若曲线控制点「权值全部相等」,则为「非有理曲线」
  • 若曲线控制点「权值不相等」,则为「有理曲线」

Non-Uniform(非均匀):

曲线是否均匀这个概念稍微比较抽象。一句话概括就是:

曲线是否均匀,取决于曲线「节点的差异值」是否相同。

  • 若曲线节点「差异值相同」,则「均匀」曲线
  • 若曲线节点「差异值不同」,则为「非均匀」曲线

这里就涉及到了另一个概念,什么是“节点的差异值”?

当在Rhino中用内插点的方式建立曲线时,这些内插点会转化为曲线节点的参数值,是曲线节点的一个属性,数值我们并看不到。

而曲线节点参数值的参数间距,就是节点的差异值。决定了曲线参数化的情况。参数间距也是一个抽象的概念,并不是节点之间的距离。

  • 当节点的参数间距都是「1」的情况下,称为「均匀」;
  • 当节点的参数间距都是「内插点之间距离」的情况下,称为「弦长」;
  • 当节点的参数间距都是「内插点之间距离的平方根」的情况下,称为「弦长平方根」。

其中,差异值为“弦长”和“弦长平方根”都是非均匀的,只有差异值都为1的情况下,才是均匀的

在Rhino中,用“控制点”建立的曲线默认是均匀曲线(差异值都为1),而用“内插点”建立的曲线,需要手动设定是否为均匀曲线。

NURBS曲线概念的小结:

综上所述,贝塞尔曲线、有理/非有理、均匀/非均匀B样条都被统一到NURBS曲线中。

其中贝塞尔曲线是最早提出也是最简单的一种曲线,但无法局部修改。

B样条曲线稍后提出,解决了贝塞尔曲线无法局部修改的缺点。

NURBS曲线最后提出,定义最复杂,能表达的曲线最灵活。主要是解决B样条不能画椭圆、圆和双曲线的问题。

NURBS曲线的三种类型

以Rhino软件为例

  • 开放NURBS曲线:起点与终点不重合。
  • 封闭NURBS曲线:起点与终点重合,所以曲线的控制点只有一个重复。
  • 周期NURBS曲线:控制点连线形成封闭的多边形,实际控制点数量=可见控制点数量+阶数

NURBS曲线的几何连续性

曲线的「几何连续性」描述的是两段曲线拼合之后,生成的新曲线的交接部分的顺滑程度。数字越高,连续性越好

  • 不连续:两个曲线断开,不存在连续性;
  • G0连续位置连续,两个曲线仅仅是端点重合;
  • G1连续相切连续,两个曲线交点处的切线是一致的(即切线斜率相同);
  • G2连续曲率连续,两个曲线交点处的曲率是一致的(但曲率图形不可导);
  • G3连续:两个曲线交点处的曲率的变化率是一致的(曲率图形可导);
    ……
  • Gn连续:两个曲线交点处的曲率的变化率的变化率的变化率的……是一致的。

一般来说,两条曲线能做到G1连续(相切连续),肉眼就已经分辨不出明显的不协调感了。如果不是制作高精度的曲面,例如汽车车身,其实做到G2连续(曲率连续),就已经能满足绝大多数建模精度的要求了

//待编辑……

  • 配图
  • Polygon建模与NURBS建模