分享讲解nurbs的一本书和一个网站

本人是名结构工程师,之前陆陆续续用Rhino+GH做过点小项目,不过NURBS的原理我是一直没搞明白,也一直很想搞明白,后来去自学了一下,发现其实这块是属于图形学的内容:一开始找了几本国内教材,基本NURBS这块也是讲的很少,甚至讲到B样条就不讲了;后来无意中发现 Les Piegl 和 Wayne Tiller写的 The NURBS book, 2e 这本书,并且发现一个很好的网站: CS3621 Introduction to Computing with Geometry Course Notes (mtu.edu)
这本书配合这个网站,我大概花了有2~3个月时间每天看一点,基本上对NURBS有了一定理解;我一直秉持一个观点:如果一个问题我没有从数学上理解,那我其实就不算正真理解。
写这个帖子,希望所有想从数学上理解NURBS,但无从下手的小伙伴,可以去看一看这本书和网站,希望对你有帮助


:)
PS:这本书是有中文版的,名字好像就叫:非均匀有理B样条。。。在工科教材的翻译版本中,绝对算得上良心的翻译了,值得一读。

6 个赞

这个网址在我收藏夹里躺了好多年。密歇根理工的在线讲义。

:handshake:
我其实也是两三年前就收藏了这个网站,但一直没有读完。其实这网站的内容基本上就很全了,只是不能像书那样在上面做做笔记 :)

这两个我都看了。
CS3621网站的内容是真的强,一步一步让你理解,比国内很多书本和网站强太多了。
这本书有点太复杂化了,内容也没有比CS3621网页更多,建议看CS3621网站的。

中文的建议看《计算机辅助几何设计与非均匀有理B样条》 (CAGD&NURBS),施法中 编著的那本。啃完你会发现有很多新发现。

几本书都看完,用Rhino的时候,就发现Rhino里面的节点向量不对(在GH里面是可以全部显示曲面或者曲线的节点向量),但是也不知道为什么一直没修正。Rhino里面的节点向量在端头处少了一个。
不过在常规的Clamped Curve Surface状态下,缺少一个隐藏的节点向量好像影响不是很大(同一个物体,导入到其他软件,显示的节点向量多2个,但是形状是不会变化的)。
这是一个数学定义上的东西,估计使用开源内核的Rhino没有注意到这部分的东西。

对网页做笔记,可以使用【印象笔记】,或者【为知笔记】之类的软件,把整个网页收到自己的笔记里面,可以完整的保留内容,然后可以自己“翻译”,笔记、评论、修正,甚至可以分享给别人看。

你所谓的“开源内核”指什么?Rhino 的内核 OpenNURBS 是开源的,但 这个 OpenNURBS 内核也是 McNeel 自己开发的,确实开发的时候有参考他人的书籍,分别是:

  • Bohm, Wolfgang, Gerald Farin, Jurgen Kahman (1984). A survey of curve and surface methods in CAGD, Computer Aided Geometric Design Vol 1. 1-60
  • DeBoor, Carl. (1978). A Practical Guide To Splines, Springer Verlag; ISBN: 0387953663
  • Farin, Gerald. (1997). Curves and Surfaces for Computer-Aided Geometric Design: A Practical Guide, 4th edition, Academic Press; ISBN: 0122490541

这里讲的很清楚。

要是真的看了 De Boor的书,应该不会弄错节点向量的。
我看的书和论文,还有网站,都是一致的,一些软件里面也可以看到NURBS的节点向量分布。
m=n+q+1,只有Rhino里面的不满足这个关系。
m+1是节点向量总数,n+1是控制点数,q是degree次数(q+1是order阶数,de Boor最早是用这个的,后来基本都用次数)。

关于 Rhino 中 NURBS 曲线端点处节点向量数量的问题这里也讲的很清楚,怎么会少一个呢?另外, GH 调用的都是 RhinoCommon 的 API 开发的,怎么可能 GH 中是对的 Rhino 中不对?

我个人感觉Rhino应该不会犯这么低级的错误吧?
虽然我书读的少 :sweat_smile:不过我个人感觉NURBS中涉及的数学相对来说还是比较简单明了的(个人感觉和rudin那种数学分析比起来,NURBS的书简直太易读了),所以会否是表示习惯或者名称的误会?
我个人看法哈,如不对请轻喷~

1 个赞

从CS3621的内容也可以得到这个公式:
If the number of knots is m+1, the degree of the basis functions is p, and the number of degree p basis functions is n+1, then m =n + p + 1.
其实它对应的是 (m+1) = (n+1)+p+1, 简化成 m=n+p+1 的等式。
按照 KN代表节点向量总数,PN代表控制点总数,D代表次数,应该是KN=PN+D+1的表达式。
(KN=PN+D-1 就意味着少了两个节点向量,对应了Rhino的首尾两端都少了一个节点向量。)

你这种算法是老的 NURBS 算法,但有的软件用的还是你写的这种算法,所以 Rhino 导出的时候会自动加两个点。

关于这一点, Rhino 有专门的说明,请看这里

https://wiki.mcneel.com/rhino/nurbsdoc

Rhino 玩的就是 NURBS ,在这个层面不会有这种低级错误的。

1 个赞

请教下,你这次和上次回复中截图的这些说明是哪个资料上的?我也想去看看。 :pray:

我把链接内置到文字里了,可能你没看到,我调整到外面了。

看到了,感谢哈~

另外,关于 Rhino 里几何的曲线、曲面、参考平面、网格等等,下面这个章节值得一读:

8 Geometry with Python (rhino3d.com)

回头去看一下
:+1::+1::+1::+1:

没听说过NURBS有新的算法,Rhino这种应该是一种省略的“表示法”,所以不通用,在导入和导出的时候会在端点处自动删除和增加一个节点向量。

NURBS是完备体系,不是从代码层面说的,是在理论算法层面。

NURBS是增加了权重的B-Spline,去掉权重考虑B-spline即可。
在一般情况下,使用的BS都是Clamped B-spline, 但实际是有三类B-spline: Floating B-spline, Clamped B-spline, Periodic B-spline,这三类是可以互相转化的,在不改变控制点位置和顺序的情况下,改变节点向量就可以转换。

节点向量的重复性,Knot vector multiplicity是不能乱的,在数学定义上,节点向量的重复个数是会影响B-spline的形状的。

NURBS 本来就是用来表示曲线和曲面的,不用来表示曲线曲面,NURBS 存在的意义是什么呢?只是为了写几个公式或者让你多解几个方程?

你怎么理解不重要,重要的是并不如你所说 Rhino 的节点向量就是错误的:

也并不如你所说,开发 Rhino 的人没有像你一样看过 De Boor 的书,所以把节点向量弄错了:

更重要的是,Rhino 的内核 OpenNURBS 是开源的,大家都可以提交自己的更改 request,你如果坚持认为 OpenNURBS 中的节点向量是错的,你可以在 Github 中提交你的代码,或者 Fork 到你自己的仓库,更改出你认为正确的版本,甚至开发出自己的商业软件都是可以的:

https://github.com/mcneel/opennurbs

并且 OpenNURBS 的开源协议非常宽松,鼓励大家将 OpenNURBS 用于商业用途,而且并不会收取任何费用。

Rhino的开发者肯定是看过书的,但是这部分可能真的是一个没留意的错误,节点向量是一个一个隐藏的(隐藏几个的结果是不一样的),从Floating B-spline逐渐变成 Clamped B-spline,然后变成Periodic B-spline。
之所以现在使用Clamped B-spline的形态,是因为它和Bezier曲线曲面相似的表现,有助于理解。
绝对均匀的B-spline,是Floating B-spline,但是很难使用,所以把 Clamped B-spline当做均匀的,其实也是“准均匀”的节点向量。

我现在并没有完全编写代码的能力,不过慢慢学吧,以后可能会做点东西。

其实你们能写代码的,可以试着从完全均匀的节点向量的B-spline(也就是Floating B-spline)开始,增加端点处的重复节点向量,能看到变化的。