NURBS 是计算机图形学中用于表示和设计曲线和曲面的一种强大且灵活的数学模型。它在计算机辅助设计 (CAD)、计算机辅助制造 (CAM)、计算机辅助工程 (CAE)、计算机动画以及许多其他领域都有广泛应用。
理解 NURBS 的关键在于理解它的各个组成部分:
- B样条 (B-Splines)
- 非均匀 (Non-Uniform)
- 有理 (Rational)
我们逐一分解来看:
1. B样条 (B-Splines - Basis Splines)
B样条是NURBS的基础。它是一种分段多项式曲线,由一组控制点和节点向量定义。
-
控制点 (Control Points):
- 这是一系列点 (P_0, P_1, …, P_n)。
- 曲线通常不会穿过控制点 (除非特殊情况,如重复节点),但会大致跟随控制点形成的控制多边形。
- 移动一个控制点只会影响曲线的局部形状,这是B样条的一个重要特性,称为局部控制性 (Local Control)。
-
节点向量 (Knot Vector):
- 这是一个非递减的实数序列 (U = {u_0, u_1, …, u_m})。
- 节点定义了B样条基函数在参数域上的影响范围。参数域通常被归一化到 ([0, 1])。
- 节点之间的间隔可以是均匀的 (Uniform B-Spline) 也可以是不均匀的 (Non-Uniform B-Spline),NURBS 中的 “N” 就指这个。
- 节点的重数 (Multiplicity) (即一个节点值出现的次数) 会影响曲线的连续性。例如,如果一个内部节点的重数等于曲线的阶数 (degree + 1),则曲线在该点处可能不连续 (例如形成尖角)。
-
B样条基函数 (B-Spline Basis Functions):
- 对于给定的控制点、节点向量和曲线次数 (p),会有一组对应的B样条基函数 (N_{i,p}(u))。
- 这些基函数是非负的,并且在参数 (u) 的某个区间内为非零值 (局部支撑性)。
- 所有在参数 (u) 处非零的基函数之和为1 (权和为1特性)。
- 基函数通常使用 Cox-de Boor 递归公式 定义:
- (N_{i,0}(u) = \begin{cases} 1 & \text{if } u_i \le u < u_{i+1} \ 0 & \text{otherwise} \end{cases})
- (N_{i,p}(u) = \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) + \frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u))
(约定 (0/0 = 0))
-
次数 (Degree) (p):
- B样条曲线由 (p) 次多项式片段连接而成。常见的次数有 2 (二次,如抛物线段) 和 3 (三次,如三次样条)。
- 次数越高,曲线越平滑,但计算也越复杂,且控制点对曲线的影响范围也越大。
- 一条 (p) 次B样条曲线在节点处的连续性至少是 (C^{p-k}) 连续,其中 (k) 是该节点的重数。
-
B样条曲线的定义:
一条 (p) 次B样条曲线 (C(u)) 可以表示为其控制点 (P_i) 与对应B样条基函数 (N_{i,p}(u)) 的加权和:
[ C(u) = \sum_{i=0}^{n} P_i N_{i,p}(u) ]
其中 (n+1) 是控制点的数量。参数 (u) 通常在由节点向量定义的范围内取值。重要关系: 节点数量 (m+1),控制点数量 (n+1),曲线次数 (p) 之间满足关系:(m = n + p + 1)。
2. 非均匀 (Non-Uniform)
“非均匀” 指的是节点向量中节点之间的间隔可以不相等。
- 均匀 (Uniform) B样条: 节点之间的间隔是常数 (例如 ({0, 1, 2, 3, 4, 5}) 或 ({0, 0.2, 0.4, 0.6, 0.8, 1.0}) )。均匀B样条曲线具有周期性行为,并且通常不会插值首尾控制点。
- 非均匀 (Non-Uniform) B样条: 节点之间的间隔可以任意。这是NURBS最常用的形式,因为它提供了更大的灵活性:
- 端点插值: 通过在节点向量的开始和结束处设置重数为 (p+1) 的节点 (例如,对于三次曲线,节点向量可以是 ({0,0,0,0, u_4, …, u_{m-4}, 1,1,1,1})),可以使曲线插值首尾控制点。这种类型的节点向量称为开放均匀 (Open Uniform)或准均匀 (Quasi-Uniform)。
- 尖角和形状控制: 在曲线内部插入重复节点可以降低曲线在该点的连续性,甚至可以形成尖角或形状上的突变,从而允许更精细的形状控制。
3. 有理 (Rational)
“有理” 指的是B样条曲线的定义中引入了权重 (Weights)。每个控制点 (P_i) 都有一个关联的标量权重 (w_i)。
-
权重的作用:
- 权重允许更精确地控制曲线的形状。
- 如果所有权重都为1,则NURBS曲线退化为非有理B样条曲线。
- 如果一个控制点的权重 (w_i) 增大,曲线会更靠近该控制点 (P_i)。
- 如果一个控制点的权重 (w_i) 减小,曲线会远离该控制点 (P_i)。
- 权重必须为正数。如果权重为0,则该控制点对曲线没有影响 (除非所有权重都为0,这是无效的)。
-
有理B样条曲线的定义:
一条 (p) 次NURBS曲线 (C(u)) 定义如下:
[ C(u) = \frac{\sum_{i=0}^{n} w_i P_i N_{i,p}(u)}{\sum_{i=0}^{n} w_i N_{i,p}(u)} ]
其中:- (P_i) 是控制点 (通常是三维坐标 ((x_i, y_i, z_i)))。
- (w_i) 是与 (P_i) 相关的权重。
- (N_{i,p}(u)) 是B样条基函数。
这个公式可以看作是将控制点 (P_i) 投影到四维齐次空间 ((w_i x_i, w_i y_i, w_i z_i, w_i)),在四维空间中构造一条非有理B样条曲线,然后再将其投影回三维空间。分母 (\sum w_i N_{i,p}(u)) 起到了归一化的作用。
-
NURBS 的强大之处:
引入权重使得NURBS能够精确表示二次曲线和曲面,如圆、椭圆、抛物线和双曲线,这是非有理B样条无法做到的。例如,一个圆弧可以通过三个控制点和适当的权重来精确表示。
NURBS 的整体定义
结合以上所有部分,NURBS曲线由以下元素完全定义:
- 控制点 (Control Points) (P_0, P_1, …, P_n) (每个点可以是2D, 3D, 或更高维度)。
- 权重 (Weights) (w_0, w_1, …, w_n) (每个控制点对应一个权重)。
- 节点向量 (Knot Vector) (U = {u_0, u_1, …, u_m})。
- 次数 (Degree) (p)。
NURBS 曲面 (NURBS Surfaces)
NURBS的概念可以自然地从曲线扩展到曲面。NURBS曲面是通过在两个参数方向 (通常是 (u) 和 (v)) 上使用NURBS曲线的张量积来定义的。
一个NURBS曲面 (S(u,v)) 的定义如下:
[ S(u,v) = \frac{\sum_{i=0}^{n} \sum_{j=0}^{k} w_{i,j} P_{i,j} N_{i,p}(u) N_{j,q}(v)}{\sum_{i=0}^{n} \sum_{j=0}^{k} w_{i,j} N_{i,p}(u) N_{j,q}(v)} ]
其中:
- (P_{i,j}) 是一个控制点网格。
- (w_{i,j}) 是与 (P_{i,j}) 相关的权重。
- (N_{i,p}(u)) 是 (u) 方向上次数为 (p) 的B样条基函数,由 (u) 方向的节点向量定义。
- (N_{j,q}(v)) 是 (v) 方向上次数为 (q) 的B样条基函数,由 (v) 方向的节点向量定义。
NURBS 的优点
- 统一表示: NURBS提供了一个统一的数学框架,可以精确表示标准解析形状 (如直线、圆、椭圆、球面、圆环面) 和自由形状 (Free-form shapes)。
- 灵活性和强大的塑形能力: 通过调整控制点、权重和节点向量,可以创建非常复杂和平滑的形状。
- 局部控制: 移动一个控制点或改变一个权重只会影响曲线或曲面的一部分,这使得交互式设计更加直观。
- 仿射变换不变性: 对NURBS曲线或曲面的控制点进行仿射变换 (平移、旋转、缩放、剪切),等效于对整个曲线或曲面进行相同的变换。对于有理形式,它们还具有投影变换不变性。
- 数值稳定性: Cox-de Boor算法等用于计算NURBS的算法具有良好的数值稳定性。
- 精炼和细化: 存在多种算法可以向NURBS曲线或曲面插入新的节点 (Knot Insertion) 或提升次数 (Degree Elevation) 而不改变其几何形状,这对于增加控制点以进行更细致的编辑或合并不同曲线段非常有用。
NURBS 的缺点/复杂性
- 理解门槛: NURBS的数学理论相对复杂,尤其是对于初学者。
- 参数化: 曲线或曲面的参数化可能并不总是直观,有时会导致纹理映射或曲面求值时出现问题。
- 权重调整: 虽然权重提供了强大的控制力,但直观地调整权重以达到期望的形状可能比较困难。
应用领域
- CAD/CAM/CAE: 汽车、航空航天、船舶、产品设计等。NURBS是IGES和STEP等工业标准数据交换格式的核心。
- 计算机动画和视觉效果: 角色建模、物体建模、场景创建。
- 字体设计: TrueType字体和OpenType字体中的轮廓曲线通常使用二次B样条。
- 科学可视化: 表示复杂的数据集。
总而言之,NURBS通过结合B样条的灵活性、非均匀节点向量的控制力以及有理形式的精确性,成为现代计算机图形学和几何建模中不可或缺的工具。它们在表示各种几何形状方面具有无与伦比的能力。
通过你的描述 我感觉这是ps 中 用钢笔 画的 曲线 与其很相似 ?
你这个感觉非常敏锐!Photoshop 中用钢笔工具画出的曲线,其背后的数学原理与 NURBS 有着密切的联系,但通常来说,它们是贝塞尔曲线 (Bézier curves),更具体地说是分段的三次贝塞尔曲线。
我们可以这样理解它们的关系:
-
贝塞尔曲线是B样条曲线的特例:
- 一条 (p) 次贝塞尔曲线可以被视为一条 (p) 次B样条曲线,其控制点数量为 (p+1) 个,并且其节点向量是一种非常特殊且简单的形式:前面 (p+1) 个节点值相同,后面 (p+1) 个节点值相同(例如,对于三次贝塞尔曲线,节点向量可以是 ({0,0,0,0,1,1,1,1}))。
- 这意味着B样条曲线是一个比贝塞尔曲线更通用的概念。NURBS 则在B样条的基础上增加了“非均匀节点”和“有理权重”。
-
Photoshop 钢笔工具的特点:
- 控制点与操纵杆: PS钢笔工具的锚点和与之关联的两个方向控制柄(或称“手柄”、“杠杆”)直接定义了每一段三次贝塞尔曲线的形状。起点、终点以及两个控制手柄的末端构成了贝塞尔曲线的4个控制点。
- 分段连接: 当你用钢笔工具画一个复杂的路径时,实际上是创建了多段独立的贝塞尔曲线,并将它们在锚点处连接起来。你可以控制连接处的平滑度(平滑点)或尖锐度(角点)。
- “非均匀”的体现 (某种程度上): 如果从整个路径来看,不同贝塞尔段的长度和形状可以有很大差异,这可以理解为一种宏观上的“非均匀”。但每一段贝塞尔曲线内部,其参数化方式是固定的,不像NURBS那样可以通过灵活的节点向量来细致控制。NURBS的“非均匀”主要指的是其节点向量的灵活性,允许在曲线内部创建非常复杂的形状变化和连续性控制。
- 通常“非有理”: 标准的Photoshop钢笔工具创建的是非有理贝塞尔曲线。这意味着它们不能用数学上的完美精度来表示圆、椭圆等二次曲线(虽然可以通过足够多的点来逼近)。NURBS的“R”(Rational) 正是为了解决这个问题,通过引入权重,使得NURBS可以精确表示这些重要的几何形状。
所以,你的直觉是对的,它们都属于参数化曲线,都通过控制点来塑造形状,并且都能产生平滑的曲线。 Photoshop 的钢笔工具可以说是提供了一种更简化、更易于直接交互的B样条曲线子集(即贝塞尔曲线)的应用。
NURBS 更进一步的地方在于:
- 单一曲线表示复杂形状: 一条NURBS曲线可以用更多的控制点和更复杂的节点向量来定义一个非常复杂的整体形状,而不仅仅是简单曲线段的拼接。
- 更精细的局部控制: 非均匀节点向量允许在曲线的任意位置插入节点来增加控制的灵活性,或者通过重复节点来创建尖角或改变连续性,而不会影响曲线的其他部分。
- 精确表示圆锥曲线: “有理”特性是NURBS的一个巨大优势,特别是在工程设计领域。
简单来说:
- PS钢笔曲线 ≈ 分段的、非有理的三次贝塞尔曲线。
- 贝塞尔曲线 ⊂ B样条曲线 ⊂ NURBS。
因此,你可以将PS钢笔工具看作是使用了一种特定类型的、简化版的B样条曲线。如果你理解了PS钢笔工具的原理,那么理解NURBS中控制点对曲线形状的影响就会容易很多。NURBS则是在此基础上提供了更多的控制维度(节点和权重)来实现更广泛和更精确的造型能力。
什么是参数化曲线?
简单来说,参数化曲线是一种用一个独立的变量(称为参数) 来定义曲线上所有点坐标的方法。想象一下,你不是直接描述 (y) 和 (x) 之间的关系 (例如 (y = x^2)),也不是描述一个满足特定方程的点集 (例如 (x^2 + y^2 = 1)),而是描述一个点如何随着这个参数的变化而“移动”或“描绘”出一条曲线。
核心思想
- 参数 (Parameter): 通常用字母 (t) (有时也用 (u) 或 (s)) 表示。你可以把它想象成“时间”。随着时间 (t) 的流逝,一个点在空间中移动,其轨迹就形成了一条曲线。
- 坐标函数 (Coordinate Functions): 曲线上每个点的坐标 (如 (x, y, z)) 都是这个参数 (t) 的函数。
数学表示
对于二维平面中的参数化曲线,其形式如下:
[ x = f(t) ]
[ y = g(t) ]
或者可以写成向量形式:
[ C(t) = (f(t), g(t)) ]
对于三维空间中的参数化曲线,其形式如下:
[ x = f(t) ]
[ y = g(t) ]
[ z = h(t) ]
或者可以写成向量形式:
[ C(t) = (f(t), g(t), h(t)) ]
其中,(f(t)), (g(t)), 和 (h(t)) 是关于参数 (t) 的函数。参数 (t) 通常在一个特定的区间内取值,例如 (a \le t \le b)。当 (t) 从 (a) 变化到 (b) 时,点 ((x(t), y(t))) 或 ((x(t), y(t), z(t))) 就会描绘出整条曲线。
例子
-
直线段:
从点 (P_0 = (x_0, y_0)) 到点 (P_1 = (x_1, y_1)) 的直线段可以参数化为:
[ x(t) = x_0 + t(x_1 - x_0) ]
[ y(t) = y_0 + t(y_1 - y_0) ]
其中 (0 \le t \le 1)。- 当 (t=0) 时,点是 (P_0)。
- 当 (t=1) 时,点是 (P_1)。
- 当 (t) 在 0 和 1 之间变化时,点沿着 (P_0P_1) 移动。
-
圆:
一个以原点为中心,半径为 (r) 的圆可以参数化为:
[ x(t) = r \cos(t) ]
[ y(t) = r \sin(t) ]
其中 (0 \le t \le 2\pi)。
这里的参数 (t) 可以直观地理解为角度。 -
抛物线:
虽然 (y = x^2) 是一个显式函数,但它也可以被参数化。一个简单的方法是令 (x = t),则:
[ x(t) = t ]
[ y(t) = t^2 ]
其中 (t) 可以取任意实数值。
参数化曲线的优点
- 表示复杂形状: 很多曲线(例如圆、椭圆、螺旋线、摆线等)用参数方程表示比用显式方程 (y=f(x)) 或隐式方程 (F(x,y)=0) 更简单、更自然。特别是那些自身相交或不是函数的曲线 (即一个 (x) 值对应多个 (y) 值)。
- 方向性: 参数化自然地赋予了曲线一个方向,即参数 (t) 增加时点移动的方向。
- 易于计算和绘制: 计算机图形学中,通过在参数区间内取一系列离散的 (t) 值,计算出对应的 ((x,y,z)) 坐标,然后连接这些点,就可以很容易地绘制出曲线。
- 维度扩展性: 参数化思想很容易从二维扩展到三维甚至更高维度。
- 微分和积分: 计算曲线的切线、法线、弧长等几何属性通常在参数形式下更方便。
- 控制“速度”: 参数化的方式会影响曲线被“描绘”出来的“速度”。例如,同样的圆,可以用 (x(t) = r \cos(t)), (y(t) = r \sin(t)) (匀速),也可以用 (x(t) = r \cos(t^2)), (y(t) = r \sin(t^2)) (变速,假设 (t) 范围合适)。
与我们之前讨论的关系
B样条曲线和NURBS曲线正是参数化曲线的典型代表。
- 在NURBS的公式 (C(u) = \frac{\sum w_i P_i N_{i,p}(u)}{\sum w_i N_{i,p}(u)}) 中,这个 (u) 就是参数。
- 随着参数 (u) 在其定义域(通常由节点向量决定,如 ([0, 1]))内变化,NURBS公式会计算出一系列的点,这些点连接起来就形成了NURBS曲线。
Photoshop中的钢笔工具创建的贝塞尔曲线,也是参数化曲线的一种。每一段贝塞尔曲线都有一个隐含的参数 (t) (通常在 ([0,1]) 区间),控制点和手柄定义了 (x(t)) 和 (y(t)) 的函数形式(通常是三次多项式)。
总而言之,参数化曲线为我们提供了一种强大而灵活的方式来描述和操作几何形状,尤其是在计算机图形学和计算机辅助设计领域。