GAMES101 学习11——几何(曲线和曲面)

举报
lutianfei 发表于 2022/05/09 15:05:30 2022/05/09
【摘要】 一、补充 2.2.1 Point CLoud 点云非二进制编码的点云文件可以直接用记事本查看,这里举例了一个包含位置、颜色以及法向量的点云文件(.obj文件)。其中每一行 v 包含了顶点(x,y,z)和颜色(r,g,b),vn表示每个点对应的法向量。 2.2.2 Polygon Mesh(多边形面)应用最多最广泛。相比点云,多边形多了一些点与点之间的连接关系。对于一个三角形面片组成的模型来...

一、Curves(曲线)

在计算机图形学应用中,我们经常需要在屏幕上绘制许多不同类型的对象。对象并非都是由平面组成,有些对象可能需要用曲线来进行描绘。为了使得描绘的曲线不受分辨率的影响,研究人员就提出一种曲线–贝塞尔曲线。它是一种显示曲线,由一系列控制点与线段组成,通过它可以得到精确的曲线。

1.1 Bézier Curves 贝塞尔曲线

贝塞尔曲线受限于由一系列控制点,它是通过使用控制点的近似切线生成曲线。已知四个点 p 1 p_1 , p 2 p_2 , p 3 p_3 , p 4 p_4 ,那么贝塞尔曲线就可以表示如下:

image.png

说明:
贝塞尔曲线本质就是对线段插值,它是一个类似递归求解的过程。

1.1.2 de Casteljau Algorithm(算法)

Casteljau算法描述了如何求解贝塞尔曲线,下面是该算法对应三个控制点的贝塞尔曲线求解过程:

已知三点 b 0 b 1 b 2 b_0 b_1 b_2 ,和插值参数 t,第一次递归插值得到 b 0 b 1 b_0 ➡ b_1 线段上的 b 0 1 b^{1}_{0} b 1 b 2 b_1 ➡ b_2 线段上的 b 1 1 b^{1}_{1}
第二次递归插值对 b 0 1 b 1 1 b^{1}_{0}➡ b^{1}_{1} 进行插值,发现他们与插值结果 b 0 2 b^{2}_{0} 构成的线段位于同一条直线上,所以递归结束,得到贝塞尔曲线结果: b 0 b 0 1 b 0 2 b 1 1 b 2 b_0➡ b^{1}_{0}➡b^{2}_{0}➡b^{1}_{1}➡b_2
image.png

由上图可以总结出求解一趟贝塞尔曲线的过程:

  1. 给定起始点和终止点(已知插值参数 t)
  2. 遍历每个控制点和该点的下一点(如 b 0 b 1 b_0 ➡ b_1 )形成的线段,对其进行插值。将插值后得到的点的集合中的第一个点和最后一个点替换为起点和终点。当起点和终点以及最终插值结果的点 ( b 0 2 b^{2}_{0} ) 是在同一条直线(如 b 0 1 b 0 2 b 1 1 b^{1}_{0}➡ b^{2}_{0}➡ b^{1}_{1} )时,递归结束回到3,否则回1。
  3. 结束,记录最终插值结果的点

一趟贝塞尔曲线的结果只是针对于当前 t 得到的结果,它只是一个点。所以我们在 t 的范围内遍历 t ,得到所有贝塞尔曲线的结果,将这些点和起始点、终止点连接起来即得到完整的曲线。

配合下面两张图更容易理解:
image.png

image.png

可以看出每次迭代求解的规模是在逐步减小的,如果我们盯着起点,插值点,终点三点看的话,会发现它们是在逐步靠近于一条直线的。当最后一次迭代时,这三个点一定会汇聚于一条直线,这一次递归的点数也减少为起点和终点两个点。所以说求解规模在不断减小,且有终止条件,所以说这个过程也是遵循递归的。

1.1.3 数学表示

image.png

其中:
n是贝塞尔曲线的阶数, b j b_{j} 是控制点(通过控制点的切线的来计算曲线), B j n ( t ) B_{j}^{n}(t) 表示Bernstein多项式。

image.png

最简单的贝塞尔曲线是从点 P 0 P_0 P 1 P_1 的直线,二次贝塞尔曲线由三个控制点确定,三次贝塞尔曲线由四个控制点确定:
image.png

1.1.4 贝塞尔曲线的性质

a. 端点性质

第一个控制点和最后一个控制点恰好是曲线的起始点和终止点。对于控制点来说,当t=0的时候处于起点,当t=1的时候处于终点。

b. 一阶导数性质

第一个控制点和第二个控制点所在连线是第一个控制点所在的曲线切线;最后一个控制点和倒数第二个控制点所在连线是最后一个控制点所在的曲线切线。

image.png
这里3是因为Cubic Bazier。

c. 仿射变换性质

当想要对曲线进行仿射变换时,只需要对不同的顶点进行仿射变换即可。
注意:对于投影无法使用该性质。

d. 凸包性质

贝塞尔曲线会被所有控制点形成的多边形所包围,如下图:
image.png

任何一个贝塞尔曲线的任意一个点,一定都在所给的控制点所形成的的凸包内。
一个例子:几个点在一条线上 → 根据凸包的性质可知 → 凸包就是这条线(任意点都在凸包内)

1.2 Piecewise(逐段) 贝塞尔曲线

为何要引入分段贝塞尔曲线?其中一个主要原因就是当控制点增多时无法很好的控制曲线的变换:
image.png

人们就引入了一种方法来解决这种问题:通过某几个控制点控制一段贝塞尔曲线,然后连接不同的贝塞尔曲线形成一条完整的贝塞尔曲线(通常是用四个控制点决定一个贝塞尔曲线)。这里需要注意的就是如何保持不同贝塞尔曲线连接起来也是平滑(连续)的,做法就是保持过曲线的两个控制点形成的切线大小相等,在方向上保持相反:

image.png

1.2.1 曲线的连续性

  1. C 0 C^0 连续:即图中 a n a_n 和$b_0都处于红点处(处于曲线中同样的位置)
    image.png

  2. c 1 c^1 连续:在曲线某点保持切线连续(大小相等,方向相反):
    image.png

1.3 样条

既然贝塞尔曲线在控制点较多时,调整一部分控制点也会影响到整条曲线。并且分段贝塞尔曲线的拼接也不是很容易进行,因为需要保持相邻曲线的连续性,所以人们又引入了样条,它更为可控。我们可以把样条看成是一条具有弹性的木条,它可以较为灵活的改变自身的形态。而 B-样条,作为贝塞尔曲线的“补充”,除了保持贝塞尔曲线自身的特性外,它另一个最大的好处就似乎可以对曲线进行局部修改。
这里有一些关于 B-样条 的原理与实现的链接,课程不做深入了解:
实现: https://github.com/thibauts/b-spline.
原理: https://zhuanlan.zhihu.com/p/50450278.

二、贝塞尔曲面

同样的,贝塞尔曲面也是由贝塞尔曲线构造得到,假设存在(n+1) × (m+1)个空间点,则m × n Bezier曲面定义为:
image.png

简单来说,就是分别在这些控制点上构造贝塞尔曲线,其中每一条曲线又会和其他控制点构成新的曲线,最终形成贝塞尔曲面:
image.png

image.png

三、Mesh Operations: Geometry Processing(网格操作)

  • Mesh subdivision:网格细分
  • Mesh simplification:网格简化
  • Mesh regularization:网格正规化

image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。