参考课程:
https://www.bilibili.com/video/BV1X7411F744?p=10
从第40分钟左右,终于到了Geometry部分。
一、几何的表达方式分类
1.隐式几何(数学公式)
隐式的几何不会告诉我们这些点在哪里,而会告诉我们这些点满足的函数关系。比如x2+y2+z^2=1就表示了一个球体。隐式的表达的缺点就是,很难直接看出它的形状是什么
但是优点就是,判断点的位置关系,在内在外在表面,很方便:
2.显式几何(映射)
通过参数映射,把uv映射到一个马鞍面上。想知道表面的样子时,把每一个UV都测一遍就行,很容易得到。
然而想要判断内外时,显式的表达就很难。
二、CSG(Constructive Solid Geometry)即可构造硬质几何体
三、距离函数
对于任意一个几何,不直接描述表面,而是描述空间中任何一个点到这个表面的最近距离。所以空间中任何一个点都会定义出一个值来。下图把两个物体的距离函数定义出来,做一个blending就能融合
距离函数应用:
四、分形
可以理解为无限套娃:
五、点云
不考虑物体是一个表面,而是表面为一堆点,只要点足够密集,就看不到点与点之间的缝隙。理论上可以表示任何几何体,通常三维扫描等得到的结果就是点云,点云可以变成三角形面。
扩展:绪论:什么是点云?
六、多边形网格
多边形网格被非常广泛地应用
七、贝塞尔曲线
1.公式计算
略
2.性质一
在仿射变换下,只需要对顶点做仿射变换,就能得到这个贝塞尔曲线在仿射变换下的结果。但是其它变换不行,比如投影变换就不行。
3.性质二
贝塞尔曲线在控制点形成的凸包内,即几个控制点形成的凸包内。
如上图就是凸包,可以把黑点当成钉子,然后一个非常大的橡皮筋,啪地一下收缩,包围而成的多边形就是凸包。
4.逐段贝塞尔曲线
控制点多了以后,贝塞尔曲线并不直观,很难控制。于是我们想到每次定义一段贝塞尔曲线,然后连起来,普遍习惯每四个控制点定义一段。但是怎么保证连接处还是平滑的呢?
答案就是导数要连续,也叫C1连续:
当然还有C0连续:
八、样条splines
船舶设计者使用细小的有弹性的木条或者钢片,通过配重的钩子约束木条的形状来设计船壳。这样的木条被称之为样条。
1.B-splines
相对于未分段的贝赛尔曲线。B样条具有局部性,即更改局部一个点,不会影响其他控制点。
B样条很复杂,可以参考
清华大学-计算机图形学基础(国家级精品课)
https://www.bilibili.com/video/av66548502
九、贝赛尔曲面
1.如何从贝赛尔曲线得到贝赛尔曲面
如图,曲面就像渔网,锚点是上面的黑点。然后锚点固定在空间中的某个位置,再接受一个力,就得到这样的形变:
具体是怎么做的呢?画出四条贝塞尔曲线后,在这四个线上再取四个点,认为是一个新的贝塞尔曲线的控制点。在不断扫的过程中,形成了曲面。
2.通过参数映射把uv 映射到曲面上任何一个点
这个没听懂……,曲面的uv,几何体的uv ??
十、Mesh Operations:Geometry Processing
- Mesh subdivision 曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果
- Mesh simplification 曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术)
- Mesh regularization 除了细分与简化之外,还有另外一种同属一类的操作叫做曲面规则化(Mesh Regularization)其所作的便是将三角面都变的尽可能相同,从而也达到提升模型效果的目的
十一、subdivision 曲面细分
创造更多的三角形,并且改变他们的位置,让表面更光滑。
1.Loop细分(Loop Subdivision)
TIPS:这里的loop是人名,不是循环的意思
Loop细分是一种专门针对三角形面的细分方法,其核心步骤也十分容易理解:
如图所示在连接每条边的中点生成一个新的三角形,原来的三角形就会被分割成4个三角形。我们将所有的顶点分为两类,一类是新生成的顶点,一类是老的原来就有的顶点,对于新生成的顶点做如下处理:
如图,先找到一个白点,它一定是某一条边的中点,找到共享这条边的两个三角形。这条边的两侧就是AB,对面的就是CD。那么生成后的白点,需要的调整位置,就是图中的公式了。其中1/8,3/8都是加权平均,公式的值怎么来的涉及到具体的算法设计就不说了,我们只考虑如何执行。
对于旧的顶点,做如下处理:
对于旧的顶点,一部分靠周围旧的顶点的值,一部分保留自己的,按照公式移动位置
- n为顶点的度(连接的边的数量),度是图论中的概念
- u为一个和n有关的数
从公式中可以看出来,如果n比较大,那么自己的坐标位置就不那么重要了。反之,如果n=2,那么自己的坐标权重就很大。
2.Catmull-Clark 细分
Loop细分假设的是三角形网格,但是对于非三角形网格,就没办法,这时候就要用到Catmull-Clark 细分。
- 定义四边形面以及非四边形面
- 如果度不为4的点 定义为奇异点(模型里叫极点,3星、5星)
找到不是四边形的面,这里以三角形为例:
取每个边的中点,以及面上取一个点(重心或其他的点),把这些点连起来即可。
在这个过程中,所有的面都变成了四边形面。也就是一次细分后,每一个非四边形面消失,并会引入一个奇异点。
现在总共有4个奇异点,在上面的过程中,两个三角形中各增加了一个奇异点。
结论很简单,在四边形内做上述操作,连接的是四条边的中点,肯定度为4,就不会增加奇异点。而非四边形,做上述操作,必定增加奇异点。
但是,做过上述操作之后,所有的非四边形面都消失了。并且之后的细分,奇异点也不会增加。也就是说,只有第一次细分时,增加了非四边形面的个数对应的奇异点。
点的位置的调整,分为三类:新的点分为 面上的点,边上的点 分别操作,老的点单独操作。可以看出,通过平均的方式,得以平滑:
如上图,最终效果,我没搞懂为啥Catmull-Clark让物体的边缘逐渐圆滑起来。
十二、Mesh simplification 曲面简化
如上图,离得远,低模完全看不出区别。这正是LOD的原理。
1.边坍缩 edge collapsing
其实曲面简化所利用的一个方法叫做边坍缩,如上图所示就是将一条边的两个顶点合成为一个顶点。但随之而来的问题就是,曲面简化需要尽量保持原本模型的shape,如何坍缩一条边,或者说坍缩哪一条边能够使得原模型样貌被改变的程度最小,这就是曲面简化的关键所在。
为此引入一个度量,即二次误差度量(Quadric Error Metrics)。即坍缩之后蓝色新顶点所在的位置与原来各个平面的垂直距离之和。如果能够使得这个误差最小那么对整个模型样貌修改一定程度上也会较小。
那么其实到这整个曲面简化的算法流程已经比较清晰了
- 为模型每条边赋值,其值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差度量
- 选取权值最小的边做坍缩,新顶点位置为原来计算得出使得二次误差最小的位置
- 坍缩完之后,与之相连其他的边的位置会改动,更新这些边的权值
- 重复上述步骤,直到到达终止条件
这其实是一个标准的贪心算法,可能到不了全局最优解,但事实证明最终的结果依然相当不错。