计算机图形学moveto画虚线_Lecture11 Geometry2【学习笔记:GAMES101现代计算机图形学入门】...

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
Flythrough of proposed Perth Citylink subway, https://youtu.be/rIJMuQPwr3E

2)Animation Curves:三维建模软件(如下图为Maya),可以定义一些曲线,再让任何模型沿着曲线去移动,和上面控制摄像机移动是一样的意思

e7e94ed6288620968485aac50d1b3712.png
Maya Animation Tutorial: https://youtu.be/b-o5wtZlJPc

3)Vector Fonts:用曲线可以定义字体,可以加入控制点,这些点形成了可以定义曲线的方法,当无限放大曲线的任何一处,都会是光滑的,不会出现像素格的情况,这就是贝塞尔曲线,也是一种显式的几何表示方法

bcdb6bd63894032ab252aa6622db561d.png

1.2 Bézier Curves(贝塞尔曲线)

用一系列的控制点去定义某一个曲线,然后这些控制点会定义曲线满足的一些性质,比如下图,它要满足曲线从P0开始,并且沿着由P0到P1的的方向,为切线往前走,同样的道理,曲线会在P3结束,并沿着P2P3往外走。

那为什么前面会有一个系数3,因为切线的长度也有讲究,这个在之后的代数部分会讲

1799a4c2753a264b1dac40ac1d746eea.png

PS:这里只定义曲线会经过起止控制点,不会经过每一个控制点

1.3 如何去画贝塞尔曲线(Bézier Curves ) ——de Casteljau Algorithm

1.3.1 quadratic Bezier(二次贝塞尔曲线)(给定3个控制点,生成的贝塞尔曲线)

1)首先要在b0开始,在b2结束,b1决定它要往哪个方向弯

f95f0c6506f0ed71547ea9dcf1e3678f.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

同样的道理,在b1b2上也找到1/3的位置的点

17185aace7a91ce4d0f61854d2e0c91e.png

4)将新找出的两个点连起来。并认为新连出的线段也是0到1,再找到1/3位置的一点。那这个点就是贝塞尔曲线在时间t的时候所在的位置

93656b15dcd0c0c44b751a430922415b.png

5)枚举所有可能的时间t,就可以将这条曲线画出来

69a739487674f02c5e760a768278da4b.png
递归的思想

1.3.2 Cubic Bézier Curve(用4个控制点)

同样用递归的思想分别找b0b1、b1b2、b2b3上的3个点,将其连起来,再到新生成的2条线段上找两个点连起来,最后在新生成的线段的上找到相应的点

9373bf7d9c5c49a60e8187dee7c0c813.png

1.3.3 可视化贝塞尔曲线

4f43970a2f96473dc3a0bea76aa49f82.png
Animation: Steven Wittens, Making Things with Maths, http://acko.net

1.4 如何用代数公式表示贝塞尔曲线

1)仍然是4个点,每两个之间找时间t,就相当于在它们两个之间做了一个位置的线性插值,也就相当于(1-t)*b0 + t *b1

bcdb9470065aff851b34b66bd37b55c7.png

上图的箭头上的t和1-t应该标反了

因为知道b0、b1、b2点的坐标,就可以将其他点显式的表示出来:

6c671ea5668cd1dd2c81b20d48751842.png

b0、b1、b2前的系数可以看成是1的平方的展开,1的平方可以写成(1-t+t)的平方,展开后也就是上面的系数了

2)那给你n+1个控制点,可以得到一个n阶的贝塞尔曲线,这个贝塞尔曲线在任意时间t都是给定的控制点的线性组合,而组合的系数就是一个多项式(伯恩斯坦多项式)

e33d8875fa37b4efd200b3e71b42106b.png

这个多项式就是描述二项分布的,就相当于(s+t)的n次方

1f9029693c22d18bfe183e8c37bd13df.png

i对应从0到n(竖着的n i应该是组合数,对应排列组合中的C(n,i))

3)简化一下,不考虑有多少层了,任意阶数的贝塞尔曲线,任意时间t的点的位置就由伯恩斯坦多项式作为系数对给定的控制点的加权

5432fe7008bee7f5c2190d2f084b3626.png

例:不用将控制点限制在平面内,在空间中仍然可以得到一个贝塞尔曲线,只要将不同的控制点输入成三维坐标,同样用伯恩斯坦多项式对其插值

3cad3baa964803a4a389e8c7f33f7f3a.png

4)因为伯恩斯坦多项式相当于对1自己的n阶展开,所以这个多项式,在同一阶上把相同时间t的几个多项式的值加起来肯定等于1,如下图,三阶,有四个不同的多项式,分别对应i等于0、1、2、3

b5ad16f35bf056112eec156f829b1531.png

1.5 贝塞尔曲线的性质

1)贝塞尔曲线规定了必须过起点和终点,所以在t=0时在起点,t=1时在终点

f66452072f6272859aa10e05752e0034.png

2)特别的,对于4个控制点,起始的切线一定是3(b1-b0),结束的切线为3(b3-b2)

e76073a0345a7585dbfb927f2bb6ca78.png

3)贝塞尔曲线在仿射变换下,可以直接不同的顶点做仿射变换,再对变换之后的顶点画一条贝塞尔曲线。这和直接对贝塞尔曲线做仿射变换的结果是一样的

投影变换就不行

4)凸包性质(Convex hull property)

画出来的贝塞尔曲线一定在所有控制点形成的凸包(能够包围一系列给定的几何形体的最小的凸多边形。如下图蓝色部分)内

ecfeffa01d84e9203522fdc70db999e0.png

1.6 逐段的贝塞尔曲线(Piecewise Bézier Curves)

1)为什么要一段一段的考虑?看下面的例子

n=10,也就是给了11个点,得到下面蓝色的曲线,虽然没有问题,但并不直观,在中间部分变成很平缓的线了,所以这条曲线不好控制,不利于用中间的控制点得到你想要的形状

ae8b0afcbdbd7634d2745ec351ca5125.png

2)什么是逐段的贝塞尔曲线

既然用很多点不好控制一个贝塞尔曲线,那就用几个控制点控制一段贝塞尔曲线,再将这些贝塞尔曲线连起来。

一般每四个控制点控制一条贝塞尔曲线,也就是Piecewise cubic Bézier

如下图,是由不同的贝塞尔曲线连接的,可以看发生剧烈拐弯处的点,显然不是通过原始的点求出来的贝塞尔曲线。而每一段贝塞尔曲线由四个点控制,如第一条由曲线起始点、下面蓝色线段的左端点、上面蓝色线段的左右端点

d41171068a1b8a02d0e9ac3bf9675821.png

一般不把第2、3个控制点连在一起,而是把4个点看成2个控制杆进行调整,如Photoshop中的钢笔工具

42fe9af4ee15e35373c5feacd540e6bc.png
David Eck, http://math.hws.edu/eck/cs424/notes2013/canvas/bezier.html

3)那怎么保证连起来的曲线是光滑的呢?

曲线光滑就是指切线方向光滑,那要如何保证切线光滑呢?当前一个曲线的后两个控制点和后面那条曲线的前两个控制点共线,并且和中间的点等距离

如果认为两条线在切线意义上连续,切线(导数)共线,大小一样

4)连续性(Continuity)

6e633ea8628f38a0902a5ee1ce63001b.png

如下图,如果给定两条贝塞尔曲线,都是由4个控制点控制的,在几何上这两条曲线都通过最中间的那个点,这就是一种最简单的连续,几何上的连续

也就是如果第一段的终止点等于第二段的起点,就管这种连续叫C0 continuity

f2420a9c0a0f168dc96d19a4a53f47af.png

e72be6af6d1261e0f93e5a1299bf2ce7.png

C1连续就是切线(一阶导数)也能够连续,也就是下面红色线段2个部分的距离是一样的,并且共线(方向相反)

3336d54a456bc2042899b4c0e0415f0c.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
A Real Draftsman’s Splinehttp://www.alatown.com/spline-history-architecture/

1)B样条(B-splines)

是basis splines的缩写,就是基函数样条

基函数:可以理解成用伯恩斯坦多项式在时间t对几个控制点做加权平均,也可以理解为用控制点的位置对伯恩斯坦多项式进行加权求和。那伯恩斯坦多项式就是一个基函数

就相当于由不同的函数通过不同的方式组合起来形成别的函数,这个函数就叫基函数

B样条:是贝塞尔曲线的扩展,能力要更强(像之前n=10的情况下,我动一个点,整个一条曲线在任何位置都会发生变化,而这在设计上并不是一个很好的性质,当我们觉得这条曲线其他的地方都很好,就想改一个点,如果贝塞尔曲线就要动所有的点,很不方便),具有局部性(我改变一个点,我知道这个控制点至多影响到这条曲线的哪些范围内)(当然分段贝塞尔也可以实现)

2)其他更深入的问题

NURBS非均匀有理B样条曲线

两个贝塞尔曲线堆在一块,如何变成一个高阶的贝塞尔曲线?

一条贝塞尔曲线如何拆开?

关于曲线曲面可以学习下面胡事民老师的课:

Prof. Shi-Min Hu’s course:

清华大学-计算机图形学基础(国家级精品课)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
94dde1137bcde1b77b476945cdffe22d.png

2 Surfaces(曲面)

曲面是一个显式的几何表示方法,那可以将曲线的概念延伸到平面上

2.1 贝塞尔曲面(Bézier Surfaces)

像左边的大象也是一个分段的贝塞尔曲面拼起来的

7c10d78fd9b8433729af1310f50aeca7.png

2.1.1 如何用贝塞尔曲线得到贝塞尔曲面?

如下图的曲面,可以理解为一个平面,中间有一个力把它拉上去

它是由4X4=16个控制点得到的,可以理解为用控制点使其得到一定的形变

ade484c48bbdab1662a987ca77bae6a2.png

大致步骤:

相当于双线性插值的理解,在两个方向上分别应用贝塞尔曲线

Animation: Steven Wittens, Making Things with Maths, http://acko.net

1)在平面上定义4X4的控制点,认为它有四行

0363f87f8daed919ccd0e30781a078cd.png

2)每一行用4个控制点得到一条曲线

cf6be62bf85159b2b4cf8a0ac7cd2d45.png

3)这4条曲线在时间t有4个点,我们认为这4个点是贝塞尔曲线的控制点,可以画出下面蓝色的线

5fd6c264a5047d427d778b4c18fd47c4.png

4)然后这个线在不同时间t来不断扫空间的过程中会得到一个曲面

777a668ae08ed707104ab04acb22cbf8.png

5)也可以任意的改变贝塞尔曲面控制点的位置

不同的贝塞尔曲面如何拼在一块才能保证边界严丝合缝?本课程不涉及了

具体做法:

1)要找到贝塞尔曲面上任何一个点,通过上面的过程看,是需要两个不同的时间t(在水平方向上找同一个时间t,找到4个点后,这4个点要连成一条曲线,还需要一个时间t),所以需要一个二维的控制,我们管它叫uv

57e11d63d0ee801dcf62a4f89f0853e8.png

2)完全可以找到某一个u沿着得到的4条曲线上,找到时间u在哪,这样可以得到4个蓝色的点,再给任何一个时间v,在这4个蓝色的点形成的曲线上找时间v,就找到了最后的点的位置(也就是曲面在uv参数下的位置)

652b05c7f174e60de3f894eb6f75ebeb.png

这也说明了为什么是显示表示的,因为是通过参数uv映射过去的

6f32115ec8c0cc4c05118e188103c796.png

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

具体操作见下节~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值