Nurbs曲线简介

article/2025/9/25 12:04:02

Nurbs曲线详解_谷棵的博客-CSDN博客_nurbs曲线

发表于2017年12月3日

了解完一种特殊的nurbs曲线:贝塞尔曲线后,从本节开始,我将逐步介绍非均匀有理本样条曲线。理解bezier曲线的相关概念对NURBS的学习非常有帮助。本文的目标是介绍NURBS曲线的背景、主要应用和基本概念,并且介绍NURBS的前世今生。

1.动机

Bezier曲线在生产实践中如果需要构造复杂图形,通常需要多条曲线连接。因为bezier曲线的阶数与控制点数量是对应的,所以单条曲线如果要更大的自由度必须提高阶数,给计算效率和数值稳定带来问题。但是如果要维持bezier曲线在接头处的连续性也比较无聊,给设计工作带来复杂性。更重要的是,如果说维持G1条件比较简单的话,维持更高次数的连续性就更加复杂了。有没有一种能够承载更多控制点(自由度),更低的阶数的参数曲线呢?答案就是NURBS,或者说样条曲线。

考虑到章节安排,我们先讨论NURBS的无理形式B样条,然后在扩展到有理形式。后面你会看到,二者的转换非常方便。

2.什么是NURBS曲线

简单的来说,NURBS即在一组(多个)区间上分别定义的bezier曲线。概念上相当于(其实就是)我们接触过的分段定义函数。他的特殊之处在于,用户不需要维护分段之间的连续性,n阶nurb天然拥有直到Cn−1级的连续性。因此,它就非常的强大了,允许我们在比较低的阶次下做出复杂的图形。

如上图,nurbs曲线对参数定义域进行了分割,假设对应的黄点处的参数只分别为{u0,u1,u2,u3,u4,u5}。这六个点将曲线分割为5部分,每个部分为一个bezier曲线。这些分割的参数成为曲线的节点(knot)。因此我们看到,相比于beizer仅有一个区间,nurb的参数定义域存在多个区间。nurbs有四个要素:

  1. 阶数
  2. 控制点序列
  3. 节点序列
  4. 控制点权值序列(仅存在于有理情况,这里不讨论)

打开AUTOCAD,输入spline 命令,画一段样条曲线,选中,输入ch命令,可以看到

控制点个数为8个,阶数为3,当前控制点的权重为-1,代表的是Autocad的默认权值,表明当前曲线为无理曲线。节点序列在Autocad的用户界面中没有进行体现,一般在曲线构造时参数化方式的选择时确定。Autocad 共提供三种参数化方式,我们到后面会集中了解。

3.NURBS曲线的用途

  1. NURBS是几何设计的工业标准。业界青睐NURBS的主要原因有:
  2. 无论对于解析型曲线(圆、圆锥曲线等)还是自由构型曲线,都有统一的数学表达形式。
  3. 自由度高,可以采用NURBS设计非常复杂的几何形体。
  4. NURBS涉及的算法可以方便的在计算机上实现,而且执行效率和数值稳定性都很高。
  5. 涵盖整个曲线族,是b样条曲线、bezier曲线的更一般形式。
  6. 具有仿射变换和透视变换下的不变性,对图形处理非常友好。
  7. 呈现曲线所需要的数据量比常规的polyline要小的多。
  8. 广泛的用户群体,以及在大学教育中的普及性。

4.nurbs历史

人们对于样条的使用始于对流线型的追求。18世纪,船舶制造业从手工业发展为科学,船舶设计从手工模型作业转为图纸设计,为了保证船壳具有流线形状,并且平均分担行船过程中水的阻力,船舶设计者使用细小的有弹性的木条或者钢片,通过配重的钩子(“duck”)约束木条的形状设计船壳。这样的木条被称之为样条(“spline”)。

现代CAD的起源要追踪到法国汽车制造商雪铁龙,雪铁龙在50年代中期推出的DS系列汽车开始使用风洞设计,将雪铁龙汽车设计带到“航天时代”,因而名声大噪。在汽车的设计过程中,汽车的模型需要在设计者与工程师的手中传递,而且50年代末,法国汽车产业采用模拟计算机连接机床制造零件。圆形,抛物线等形状容易输入,而自由曲线亦需要有统一的数学形式。摆在工程师面前的问题是,有没有一种统一的数学形式,可以将汽车几何造型表达出来?

雪铁龙的 Paul de Faget de Casteljau在1963年发明了de Casteljau(德卡斯特里奥)算法,通过这套算法可以计算出“曲线”上的点。他顿悟了与其定义一条以长度作为参数的曲线,不如定义一系列控制点,通过改变控制点的形状影响曲线形状。在当时,de Casteljau的做法无疑是最大的创新,起初也遭到了公司内部的质疑,但是这个年轻的数学家最终说服公司采纳他的算法,并且最终获得成功。雪铁龙严格要求对de Casteljau算法保密,直到8年之后de Casteljau的成果才得以发表。

尽管雪铁龙进行了严密的保密工作,其竞争对手雷诺公司还是了解到了de Casteljau的工作,并且对他的工作进行了深入的研究,尽管不是de Casteljau算法本身。1966年,雷诺公司的bezier和他的团队独立的重现了de Casteljau的研究成果,并且将“曲线”正式命名为“Bezier”曲线。与雪铁龙不同,雷诺允许贝塞尔发表他的研究成果。所以现在大家一般都了解贝塞尔,而de Casteljau在大众中就没有那么高的知名度了。

有意思的是,贝塞尔的工作最初也收到了管理层的嘲讽。“如果说你的方法那么好,美国人肯定早就发明了!”听起来是不是似曾相识?可见当时的法国汽车制造业还是非常“传统”的。当然,美国人也没有闲着,GM的学者Carl de Boor发明了de Boor算法,是一种计算B样条上点的方法。尽管B样条作为一种数学模型在20世纪40年代就已经存在,但是因为de Boor算法优越的数值稳定性,B样条才发挥了它巨大的应用潜力。

波音公司的探索。波音公司是CAGD的先驱。50年代就推出了自己的设计软件,但是直到10年后,物理的木质样条仍然被很多波音工程师在工作中使用。而且不同的部门采用不同的模型,bezier曲线,B样条曲线等同时存在,波音迫切需要制定一种统一的数学模型统一公司上下。于是成了一个委员会。这个委员会最终设计了一种数学模型,称之为非均匀有理B样条(NURBS)。统一了波音所有的需求。并且快速成为CAD数据交换的工业标准。

虽然在航空,汽车,航海上得以应用,但是NURBS在表达复杂自然形状方面会遭遇拓扑问题,NURBS很难表达复杂的拓扑。1994年,Pixar 公司出版了著名的《玩具总动员》其中的各种人物与道具都是由很多NURBS曲面拼接而成的。但是这种处理特别的费时费力,而且容易发生错误。因而到97年《棋逢对手》发布时,Pixar切换到了表面细分(subdivision surfaces)技术。

subdivision surfaces

从NURBS 转换到曲面细分,是设计与实现的分离。设计师仍然希望使用NURBS良好的控制特性,但是动画渲染人员更希望简单、容易计算的模型。纵观NURBS的发展,无非是数学模型不断一般化的过程,从开始的bezier,到B样条,再到无理B样条,再到NURBS,数学模型的泛化能力越来越强大。发展到现在,CAD领域最重要的任务之一就是建立细分表面(subdivision surfaces)之间的桥梁。

nurbs发展

最新的进展是T-Splines,由Autodesk引入,T-Splines 承诺将细分表面的逐步细化的接口、复杂的拓扑形状与NURBS曲面的精确性与控制力进行良好的融合,让用户具有更高的灵活性,而不需要考虑复杂的技术细节。

到这里,NURBS的发展历史基本上说完了。可以看到,nurbs从近代发展到今天,使命始终都是提供一种直观的数学模型和操作方式,解决人们在生产实践中的问题。伴随着计算能力的日益增长,AR/VR ,3D打印等技术的不断增强,开源软件规模的不断扩大,NURBS技术将会不断延伸到各个领域。


本文参考:

  1. Introduction to Computing with Geometry 第六章第一节
  2. 什么是NURBS?
  3. About Nonuniform Rational B-Splines – NURBS
  4. A Brief History of the Computational Curve

WeChatSina WeiboQzone分享


http://chatgpt.dhexx.cn/article/d3yyCBML.shtml

相关文章

文献计量三大定律之一---洛特卡定律及普赖斯定律

科学生产率是洛特卡定律的基础,科学生产率”(Scientific Productivity))是指科学家(科研人员)在科学上所表现出的能力和工作效率,通常用其生产的科学文献的数量来衡量。 1926年,洛特卡在一篇论文中提出了科…

关于罗德里格斯公式(Rodrigues‘sFormula)的详细推导过程

关于罗德里格斯公式[RodriguessFormula]的详细推导过程 1 旋转向量2 罗德里格斯公式2.1 罗德里格斯公式定义2.2 罗德里格斯公式推导 3 旋转矩阵到旋转向量的转换 1 旋转向量 实际上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。我们可以使用一个向量 u u u&…

Armijo-Goldstein准则及Wolfe-Powell准则

Armijo-Goldstein准则及Wolfe-Powell准则 line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。 本文主要介绍一下,…

【格拉霍夫定理】【四连杆系统】Grashof’s Law for a Planar Four-Bar Linkage

在《Craig, John J - Introduction to Robotics_ Mechanics and Control-Pearson (2013)》一书中提到 “a four-bar linkage has only one degree of freedom” ,即“四连杆机构只有一个自由度”。本文将从零基础开始解释此句的原因。由于自学,恐有疏漏&…

开关功率器件(MOSFET IGBT)损耗仿真方法

说明:IGBT 功率器件损耗与好多因素相关,比如工作电流,电压,驱动电阻。在出设计之前评估电路的损耗有一定的必要性。在确定好功率器件的驱动参数后(驱动电阻大小,驱动电压等),开关器…

最优控制理论 六、拉格朗日乘子法和KKT条件

拉格朗日乘子法和KKT条件 1. 等式约束最优化2. 不等式约束最优化2.1 1个不等式约束2.2 KKT条件2.3 二维不等式约束图解 3. MATLAB不等式约束优化总结4. 参考文献 最优控制是建立在最优化基础上的,它所处理的是无穷维路径函数的泛函极值问题,而后者是处理…

Buck变换器MOSFET开关过程分析与损耗计算

为了方便理解MOSFET的开关过程及其损耗,以Buck变换器为研究对象进行说明(注:仅限于对MOSFET及其驱动进行分析,不涉及二极管反向恢复等损耗。) 图1所示为Buck变换器拓扑,其中用于减小主功率电路的AC Loop&am…

JAVA-如何修改源码(重写JAR包里的类)

今天写代码的时候发现alibaba的druid工具对postgresql数据库的union all语法支持不够完善,具体场景: select id,name from a union all (select id,name from b order by id); 该语法在druid工具中被解析为: select id,name from a uni…

堆的操作(Java)

文章目录 1.堆的存储方式2.堆的创建2.1向下调整2.2向上调整 3.堆的操作3.1元素插入堆3.2取堆顶元素3.3删除堆顶元素 1.堆的存储方式 由堆的概念可知,堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来存储堆。 注意: 对于非完全二叉树…

[Java]堆

目录 一、堆的概念 二、大小根堆的建立 三、 堆的调整 1. 向下调整 2. 向上调整 三、堆的删除与插入 一、堆的概念 堆可以看做一个完全二叉树,如果有一个关键码的集合K {k0,k1, k2,…,kn-1},把它的所…

JVM-堆

文章目录 堆,是运行是数据区的一部分堆内存分区:JAVA堆区细分: 设置堆内存大小与OOM设置堆空间大小 OOM Outof Memory Error 举例!!!图解对象分配过程Minor GC、Major GC、Full GC年轻代 GC(Minor GC)触发机制老年代 G…

jvm堆大小的设置

问题引入: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio3,,其最小内存值和Survivor区总大小分别是(10240m 2048m); 解析: -Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻…

如何修改java中堆、栈空间的默认大小

1、修改堆、栈空间大小的命令 在命令行中输入java -X可以得到设置java堆大小和栈大小的命令 2、修改java运行时的堆和栈空间 进入界面后 按AltV 3、检验堆空间修改 3.1 测试类 public class StackTest {public static void main(String[] args) {//返回Java虚拟机中的堆内存…

java 堆设置

Young:主要是用来存放新生的对象。(Eden、survivorSpaces(from、To)) Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候…

Java堆内存设置

堆内存设置 原理 JVM堆内存分为2块:永久空间和堆空间。 永久即持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap {Old NEW {Eden,from&#xff0…

OBEX(一)

一、概述 1、OBEX v2.0(v2.0版本开始OBEX直接在L2CAP上传输,v2.0版本以前OBEX在RFCOMM上传输) 2、OBEX即Object Exchange Protocol,对象交换协议 3、OBEX协议是典型的client/server request-response模型 4、OBEX v2.0蓝牙协议…

利用docker部署oxidized网络设备备份系统

随着网络设备的增多,通过人手备份网络设备倍感压力,而且效率低。有编程基础的人可能会通过Python的parimiko 或者netmiko 连接到设备操作 把文件通过ftp 上传到FTP服务器, 在通过定时任务,定期自动备份。这个应该是现阶段主流非人民币网络玩家的最优解决方案。 今天我们来看看…

网络自动化运维第一篇 自动化备份网络配置

网络设备厂商众多,各种安全厂商,网络厂商,负载均衡厂商,如果想实现自动化备份配置,可以自己写python脚本。如果网络设备厂商多,自己写python 非常耗费时间精力。偶然在网上发现了oxidized 非常好用&#xf…

.odex文件的反编译

0x00 问题呈现 在分析某手机自带应用时,为了在JEB中反编译,将其adb pull到了电脑上。解压后发现如下文件: APK解压目录列表 惊奇的发现该APK包中没有dex文件,一开始特别疑惑没有dex文件,也就是没有代码,那…

ZeroDivisionError: integer division or modulo by zero

这里的错误就是由于数据集太小。 # 2. Split into train / validation partitionsn_val int(len(dataset) * val_percent)n_train len(dataset) - n_val#我这里是刚好有10张数据集然后其中一张被拆分为验证集导致训练集太小,从而报错。