Geometry几何2(Curves and Surfaces)
本节课主要内容:
• Curves
- Bezier curves
- De Casteljau’s algorithm
- B-splines, etc.
• Surfaces
- Bezier surfaces
- Subdivision surfaces (triangles & quads)
1 Curves (曲线)
1.1 曲线应用的例子
1)Camera Paths:可以定义空间中摄像机运动的轨迹
![4551ec75dc0ead0a38c31275160f375b.png](https://i-blog.csdnimg.cn/blog_migrate/75a63fb45552b1a1f568cfc1de204fba.jpeg)
2)Animation Curves:三维建模软件(如下图为Maya),可以定义一些曲线,再让任何模型沿着曲线去移动,和上面控制摄像机移动是一样的意思
![e7e94ed6288620968485aac50d1b3712.png](https://i-blog.csdnimg.cn/blog_migrate/91a6fe81aa66c74e9bc3ee4d21e36188.jpeg)
3)Vector Fonts:用曲线可以定义字体,可以加入控制点,这些点形成了可以定义曲线的方法,当无限放大曲线的任何一处,都会是光滑的,不会出现像素格的情况,这就是贝塞尔曲线,也是一种显式的几何表示方法
![bcdb6bd63894032ab252aa6622db561d.png](https://i-blog.csdnimg.cn/blog_migrate/b4b926606cabc2da6a32226e47df283e.jpeg)
1.2 Bézier Curves(贝塞尔曲线)
用一系列的控制点去定义某一个曲线,然后这些控制点会定义曲线满足的一些性质,比如下图,它要满足曲线从P0开始,并且沿着由P0到P1的的方向,为切线往前走,同样的道理,曲线会在P3结束,并沿着P2P3往外走。
那为什么前面会有一个系数3,因为切线的长度也有讲究,这个在之后的代数部分会讲
![1799a4c2753a264b1dac40ac1d746eea.png](https://i-blog.csdnimg.cn/blog_migrate/e4a39c815ad7bb3c2efdb5a0a39eaec6.png)
PS:这里只定义曲线会经过起止控制点,不会经过每一个控制点
1.3 如何去画贝塞尔曲线(Bézier Curves ) ——de Casteljau Algorithm
1.3.1 quadratic Bezier(二次贝塞尔曲线)(给定3个控制点,生成的贝塞尔曲线)
1)首先要在b0开始,在b2结束,b1决定它要往哪个方向弯
![f95f0c6506f0ed71547ea9dcf1e3678f.png](https://i-blog.csdnimg.cn/blog_migrate/88ce38dda4ad5deac3ac65144ed34e60.png)
2)假设这条曲线我可以定义它的起点是在时间0,它的终点在时间1,那么想要画出这条曲线实则就是要把它在0到1之间的任意一个时间t,这个曲线的点对应在平面上哪个位置。也就是说,给你一个时间t在0到1之间,你告诉我这个点在哪。de Casteljau这个算法就是告诉我们怎么样找这个点,也就是将画整个曲线的算法转换成了找一个点
3)这3个点形成了2个线段b0b1、b1b2,假设方向就是按照输入的顺序,b0到b1到b2。已知时间t,在b0b1上我们认为b0是0,b1是1,那时间t是多少?比如下图中的t大概等于1/3,那就在b0b1上找1/3的位置,找到一个点
![c01fbd955ab02e84c6ec1cdaa8fe9296.png](https://i-blog.csdnimg.cn/blog_migrate/e8ad20dac1fa349c997f8230ceced2cf.png)
同样的道理,在b1b2上也找到1/3的位置的点
![17185aace7a91ce4d0f61854d2e0c91e.png](https://i-blog.csdnimg.cn/blog_migrate/5da46da2621ad23088080fc299f5697f.png)
4)将新找出的两个点连起来。并认为新连出的线段也是0到1,再找到1/3位置的一点。那这个点就是贝塞尔曲线在时间t的时候所在的位置
![93656b15dcd0c0c44b751a430922415b.png](https://i-blog.csdnimg.cn/blog_migrate/84c4a43aa8a7df7fc10a717c514f71c9.png)
5)枚举所有可能的时间t,就可以将这条曲线画出来
![69a739487674f02c5e760a768278da4b.png](https://i-blog.csdnimg.cn/blog_migrate/7f39023d98012e2f38900bb8f9b6f747.png)
递归的思想
1.3.2 Cubic Bézier Curve(用4个控制点)
同样用递归的思想分别找b0b1、b1b2、b2b3上的3个点,将其连起来,再到新生成的2条线段上找两个点连起来,最后在新生成的线段的上找到相应的点
![9373bf7d9c5c49a60e8187dee7c0c813.png](https://i-blog.csdnimg.cn/blog_migrate/6071d36b5d88335b9081548fad64f4e7.png)
1.3.3 可视化贝塞尔曲线
![4f43970a2f96473dc3a0bea76aa49f82.png](https://i-blog.csdnimg.cn/blog_migrate/03982a18c6893d0ae09e8f911f028d65.jpeg)
1.4 如何用代数公式表示贝塞尔曲线
1)仍然是4个点,每两个之间找时间t,就相当于在它们两个之间做了一个位置的线性插值,也就相当于(1-t)*b0 + t *b1
![bcdb9470065aff851b34b66bd37b55c7.png](https://i-blog.csdnimg.cn/blog_migrate/50e6d4677cf37f4c6ce1edc50e1d25ad.png)
上图的箭头上的t和1-t应该标反了
因为知道b0、b1、b2点的坐标,就可以将其他点显式的表示出来:
![6c671ea5668cd1dd2c81b20d48751842.png](https://i-blog.csdnimg.cn/blog_migrate/8243c4d3ad0e191a8995a40eb8d9ff76.png)
b0、b1、b2前的系数可以看成是1的平方的展开,1的平方可以写成(1-t+t)的平方,展开后也就是上面的系数了
2)那给你n+1个控制点,可以得到一个n阶的贝塞尔曲线,这个贝塞尔曲线在任意时间t都是给定的控制点的线性组合,而组合的系数就是一个多项式(伯恩斯坦多项式)
![e33d8875fa37b4efd200b3e71b42106b.png](https://i-blog.csdnimg.cn/blog_migrate/dfc211fbdd6ceed9d1da1e200ac9f1da.png)
这个多项式就是描述二项分布的,就相当于(s+t)的n次方
![1f9029693c22d18bfe183e8c37bd13df.png](https://i-blog.csdnimg.cn/blog_migrate/16fe441c425710b7ec221fce0f0d3cb9.png)
i对应从0到n(竖着的n i应该是组合数,对应排列组合中的C(n,i))
3)简化一下,不考虑有多少层了,任意阶数的贝塞尔曲线,任意时间t的点的位置就由伯恩斯坦多项式作为系数对给定的控制点的加权
![5432fe7008bee7f5c2190d2f084b3626.png](https://i-blog.csdnimg.cn/blog_migrate/27fd02aa5aa0824f85b1d5054e341009.png)
例:不用将控制点限制在平面内,在空间中仍然可以得到一个贝塞尔曲线,只要将不同的控制点输入成三维坐标,同样用伯恩斯坦多项式对其插值
![3cad3baa964803a4a389e8c7f33f7f3a.png](https://i-blog.csdnimg.cn/blog_migrate/d75af4b1cc3b2913287484955064cda2.jpeg)
4)因为伯恩斯坦多项式相当于对1自己的n阶展开,所以这个多项式,在同一阶上把相同时间t的几个多项式的值加起来肯定等于1,如下图,三阶,有四个不同的多项式,分别对应i等于0、1、2、3
![b5ad16f35bf056112eec156f829b1531.png](https://i-blog.csdnimg.cn/blog_migrate/708e17924342e6c2ece12103c76d4972.png)
1.5 贝塞尔曲线的性质
1)贝塞尔曲线规定了必须过起点和终点,所以在t=0时在起点,t=1时在终点
![f66452072f6272859aa10e05752e0034.png](https://i-blog.csdnimg.cn/blog_migrate/2362cc29c3141ae56c52660735a817be.png)
2)特别的,对于4个控制点,起始的切线一定是3(b1-b0),结束的切线为3(b3-b2)
![e76073a0345a7585dbfb927f2bb6ca78.png](https://i-blog.csdnimg.cn/blog_migrate/f5d7c248b935ccce772347a605b8c94a.png)
3)贝塞尔曲线在仿射变换下,可以直接对不同的顶点做仿射变换,再对变换之后的顶点画一条贝塞尔曲线。这和直接对贝塞尔曲线做仿射变换的结果是一样的
投影变换就不行
4)凸包性质(Convex hull property)
画出来的贝塞尔曲线一定在所有控制点形成的凸包(能够包围一系列给定的几何形体的最小的凸多边形。如下图蓝色部分)内
![ecfeffa01d84e9203522fdc70db999e0.png](https://i-blog.csdnimg.cn/blog_migrate/fe14933730c966dd0bedcdb6bb85e86e.png)
1.6 逐段的贝塞尔曲线(Piecewise Bézier Curves)
1)为什么要一段一段的考虑?看下面的例子
n=10,也就是给了11个点,得到下面蓝色的曲线,虽然没有问题,但并不直观,在中间部分变成很平缓的线了,所以这条曲线不好控制,不利于用中间的控制点得到你想要的形状
![ae8b0afcbdbd7634d2745ec351ca5125.png](https://i-blog.csdnimg.cn/blog_migrate/828859eb66c38dec055da10d93770d1b.png)
2)什么是逐段的贝塞尔曲线
既然用很多点不好控制一个贝塞尔曲线,那就用几个控制点控制一段贝塞尔曲线,再将这些贝塞尔曲线连起来。
一般每四个控制点控制一条贝塞尔曲线,也就是Piecewise cubic Bézier
如下图,是由不同的贝塞尔曲线连接的,可以看发生剧烈拐弯处的点,显然不是通过原始的点求出来的贝塞尔曲线。而每一段贝塞尔曲线由四个点控制,如第一条由曲线起始点、下面蓝色线段的左端点、上面蓝色线段的左右端点
![d41171068a1b8a02d0e9ac3bf9675821.png](https://i-blog.csdnimg.cn/blog_migrate/f335d95295175468f890ac7f410a43dd.png)
一般不把第2、3个控制点连在一起,而是把4个点看成2个控制杆进行调整,如Photoshop中的钢笔工具
![42fe9af4ee15e35373c5feacd540e6bc.png](https://i-blog.csdnimg.cn/blog_migrate/abb3611a1f424795f3afaee7a6241d12.png)
3)那怎么保证连起来的曲线是光滑的呢?
曲线光滑就是指切线方向光滑,那要如何保证切线光滑呢?当前一个曲线的后两个控制点和后面那条曲线的前两个控制点共线,并且和中间的点等距离
如果认为两条线在切线意义上连续,切线(导数)共线,大小一样
4)连续性(Continuity)
![6e633ea8628f38a0902a5ee1ce63001b.png](https://i-blog.csdnimg.cn/blog_migrate/87a99f5e49fda6889b8e2253f1c85f1e.png)
如下图,如果给定两条贝塞尔曲线,都是由4个控制点控制的,在几何上这两条曲线都通过最中间的那个点,这就是一种最简单的连续,几何上的连续。
也就是如果第一段的终止点等于第二段的起点,就管这种连续叫C0 continuity
![f2420a9c0a0f168dc96d19a4a53f47af.png](https://i-blog.csdnimg.cn/blog_migrate/24f30b57ae18e3607e627521187fdf6b.png)
![e72be6af6d1261e0f93e5a1299bf2ce7.png](https://i-blog.csdnimg.cn/blog_migrate/20a26a3520867f4dfccd8a79b05f16b3.png)
C1连续就是切线(一阶导数)也能够连续,也就是下面红色线段2个部分的距离是一样的,并且共线(方向相反)
![3336d54a456bc2042899b4c0e0415f0c.png](https://i-blog.csdnimg.cn/blog_migrate/cd2a1dfa0aaf046ea0a34631e75fd9f7.png)
- C2连续就要保证曲率一样(二阶导数连续)
-----补充内容开始-----
对于NURBS(Non-Uniform Rational B-Splines,非均匀有理B样条曲线)软件中G0、G1、G2等表示连续性的词:
曲面G0G1G2连续性解释 - Rhino建模 - 学犀牛中文网 - Powered by Discuz!www.xuexiniu.com下面是引用以上链接中的部分内容:
G0的意思就是说,两条直线或两个曲面在位置上相接,保持连续但并不光滑过度,在相接处形成尖点或突出棱。
G1的意思是相切连续。对于两条曲线来说,在接头处,各有两个控制点保证这种连续性,也就是说用4个控制点来保证两条曲线的相切关系。对于两个曲面来说,就是用4排控制点保证曲面的相切连续关系。
G2的意思是曲率连续。这是曲线(或曲面)可以达到的最光滑连接,需要利用每个曲线上的3个控制点或每个曲面上3排控制点来保证这种连续性。所以要想达到g2连续性,至少要有6个控制点在同一高度。
-----补充内容结束-----
1.7 其他类型的样条
样条(Spline):一个连续的曲线是由一系列的控制点控制的,并能够满足一定的连续性。简单来说就是一个可控的曲线
下图是早期人们画曲线的方式:
![91a21a94e573f34cd5c249c1bb645c47.png](https://i-blog.csdnimg.cn/blog_migrate/7a90fcc889bd31b17fc0f36b11472f06.jpeg)
1)B样条(B-splines)
是basis splines的缩写,就是基函数样条
基函数:可以理解成用伯恩斯坦多项式在时间t对几个控制点做加权平均,也可以理解为用控制点的位置对伯恩斯坦多项式进行加权求和。那伯恩斯坦多项式就是一个基函数
就相当于由不同的函数通过不同的方式组合起来形成别的函数,这个函数就叫基函数
B样条:是贝塞尔曲线的扩展,能力要更强(像之前n=10的情况下,我动一个点,整个一条曲线在任何位置都会发生变化,而这在设计上并不是一个很好的性质,当我们觉得这条曲线其他的地方都很好,就想改一个点,如果贝塞尔曲线就要动所有的点,很不方便),具有局部性(我改变一个点,我知道这个控制点至多影响到这条曲线的哪些范围内)(当然分段贝塞尔也可以实现)
2)其他更深入的问题
NURBS非均匀有理B样条曲线
两个贝塞尔曲线堆在一块,如何变成一个高阶的贝塞尔曲线?
一条贝塞尔曲线如何拆开?
关于曲线曲面可以学习下面胡事民老师的课:
Prof. Shi-Min Hu’s course:
清华大学-计算机图形学基础(国家级精品课)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com![94dde1137bcde1b77b476945cdffe22d.png](https://i-blog.csdnimg.cn/blog_migrate/029ed5bde57bbf737b3f97f0fbd04c55.jpeg)
2 Surfaces(曲面)
曲面是一个显式的几何表示方法,那可以将曲线的概念延伸到平面上
2.1 贝塞尔曲面(Bézier Surfaces)
像左边的大象也是一个分段的贝塞尔曲面拼起来的
![7c10d78fd9b8433729af1310f50aeca7.png](https://i-blog.csdnimg.cn/blog_migrate/a73bc2bdc9ddbdb4cca6508d1044e8dd.jpeg)
2.1.1 如何用贝塞尔曲线得到贝塞尔曲面?
如下图的曲面,可以理解为一个平面,中间有一个力把它拉上去
它是由4X4=16个控制点得到的,可以理解为用控制点使其得到一定的形变
![ade484c48bbdab1662a987ca77bae6a2.png](https://i-blog.csdnimg.cn/blog_migrate/3560d8a58815da25572d5205e750680f.jpeg)
大致步骤:
相当于双线性插值的理解,在两个方向上分别应用贝塞尔曲线
Animation: Steven Wittens, Making Things with Maths, http://acko.net
1)在平面上定义4X4的控制点,认为它有四行
![0363f87f8daed919ccd0e30781a078cd.png](https://i-blog.csdnimg.cn/blog_migrate/fbc81390190d90268ec21d749e34e2bd.png)
2)每一行用4个控制点得到一条曲线
![cf6be62bf85159b2b4cf8a0ac7cd2d45.png](https://i-blog.csdnimg.cn/blog_migrate/79ed637de250ebdbaacd3fb0fea5e33c.jpeg)
3)这4条曲线在时间t有4个点,我们认为这4个点是贝塞尔曲线的控制点,可以画出下面蓝色的线
![5fd6c264a5047d427d778b4c18fd47c4.png](https://i-blog.csdnimg.cn/blog_migrate/8885ee6ced14fdfd258ec6f18bcfc9c8.png)
4)然后这个线在不同时间t来不断扫空间的过程中会得到一个曲面
![777a668ae08ed707104ab04acb22cbf8.png](https://i-blog.csdnimg.cn/blog_migrate/4f4220552835651cb88949eb5ce26054.jpeg)
5)也可以任意的改变贝塞尔曲面控制点的位置
不同的贝塞尔曲面如何拼在一块才能保证边界严丝合缝?本课程不涉及了
具体做法:
1)要找到贝塞尔曲面上任何一个点,通过上面的过程看,是需要两个不同的时间t(在水平方向上找同一个时间t,找到4个点后,这4个点要连成一条曲线,还需要一个时间t),所以需要一个二维的控制,我们管它叫uv
![57e11d63d0ee801dcf62a4f89f0853e8.png](https://i-blog.csdnimg.cn/blog_migrate/caa241f641a8f9195dca8bc8da69c7fa.jpeg)
2)完全可以找到某一个u沿着得到的4条曲线上,找到时间u在哪,这样可以得到4个蓝色的点,再给任何一个时间v,在这4个蓝色的点形成的曲线上找时间v,就找到了最后的点的位置(也就是曲面在uv参数下的位置)
![652b05c7f174e60de3f894eb6f75ebeb.png](https://i-blog.csdnimg.cn/blog_migrate/82d80eafa3972290a5023e304f59a060.png)
这也说明了为什么是显示表示的,因为是通过参数uv映射过去的
![6f32115ec8c0cc4c05118e188103c796.png](https://i-blog.csdnimg.cn/blog_migrate/ba32c21f80e1e1d86f8ae999e3baf0fe.jpeg)
2.2 网格操作:几何处理(Mesh Operations: Geometry Processing)(以三角形网格为例)
2.2.1 网格操作的类型
1)Mesh subdivision(网格细分)
用更多的三角形得到更光滑的表面(见下图牛2到牛3)
2)Mesh simplification(网格简化)
用更少的面可以节省很多存储(见下图牛2到牛4)
3)Mesh regularization(网格正规化)
让三角形不至于出现特别尖特别长的情况,都变成一个和正三角形相似的比较规则的三角形(见下图牛2到牛5)
![869b5359294da79e4546ac8b880d6462.png](https://i-blog.csdnimg.cn/blog_migrate/76b378364d14c5fe0839f29efa55f9db.jpeg)
具体操作见下节~