本篇我们将开启GAMES101几何部分的讲解的第一讲解,也是几何的基本表示,现实中有非常多的几何,如布料,绝对光滑的曲面,水滴,毛发,微观的细胞等等非常复杂的几何,那么如何在计算机中表示这些几何呢?本篇我们将会介绍两种几何的基本表示方法,分别是隐式表示和显式表示。
隐式的几何表示,简单的说,就是不给出顶点或面的具体位置信息,而告诉点之间满足的关系,而推广之后我们完全可以用函数表示这一关系,如:f(x,y,z)=0,那就可以说明点在几何上。
但是隐式表示并不直观,根据一个及其复杂的公式,我们很难直接判断它表示的是什么形状。当然隐式表示也有好处,我们完全可以根据公式判断点在几何外/上/内,就比如f(x,y,z)>0,那么就说明点在几何外,小于则在几何内,等于则恰好在几何上。
接下来我们将介绍几种常见的隐式表示方法。
第一种,数学公式,我们前面说了,很不直观,而且如果对于过于复杂的几何,想写出公式是很难的。
如图所示,这种方法就是用不同简单的几何,在它们之间使用交,并,差等布尔运算从而形成复杂的几何的方法。通过简单的几何运算进而生成复杂的几何。
第三中方法叫做距离函数,对于任何一个几何,我们都不直接描述它的表面,我们去描述任何一个点到这个表面的最近距离,如上图的两个球融合的过程。
其中距离函数表示的就是空间中的任何一个点到我们想要描述的几何上的任何一个点在空间中的最小距离。这个距离可正可负,只是在几何内外的区别。
上图中两个球融合的过程则是分别算出两球的距离函数,然后将它们混合在一起,再把它恢复成原来的物体形成的过程。
下面通过闫令琪老师的例子解释,如上图中的A,B两张图分别左边被一块阴影挡住,那么怎么描述A左边1/3阴影扩大到B左边2/3阴影的中间过程呢?如果我们单纯的对A,B两张图做blend操作,那么得出的结果显然是不对的,结果会在左1/3是两张图叠在一起,中间1/3是只有B的阴影,而右1/3则是空白。
那么我们对两张图的距离函数做blend操作呢?我们假设阴影的边界是我们表示的几何,那么它的距离函数的值应该分布在阴影边界的两边,我们假定左边是负值,右边是正值,那么线本身则为0,可以看到我们进行blend操作后,第三张图的阴影边界的距离函数值就是0,也就是说我们得到了中间的过程。这也证明了我们对它们的距离函数blend就是对它们的边界blend。
我们可以通过找到混合后的距离函数为0的点来恢复几何的表面,那么当混合后的距离函数不是那么容易用式子所标示出来的时候呢?我们可以通过其他定义方式来表示这个混合后的距离函数,如上图所示的水平集方法,把距离放在空间分成的格子中,而f(x)=0这条线就可以通过插值的方式来确定了。水平集的方法也得到了很多应用,如地理上的等高线。
水平集方法当然不仅仅只应用在二维空间,还可以应用在三维空间,如上图中的人体扫描图,这可以和我们之前说到的三维纹理结合起来,同时我们还可以描述上图中的水滴四溅时涟漪中连起来的水滴,并且通过水平集得出它们的样子。
分形,指自相似,自己的一个部分和自己长得很像,也就是递归。如六边形的雪花每一分支又是一个六边形。这种几何在渲染中表示很困难,会产生严重的走样。
显示的表示方法,要么直接给出,要么通过参数映射给出,如上图的马鞍面就是用参数映射的方式表示出来的,定义一个二维uv坐标,uv的每个坐标都对应了三维空间中的一个点(x,y,z),那么只需要逐行扫描一遍这个uv,就可以得出三维空间中的马鞍面了。显式几何缺点:难以确定点和几何的位置关系。
通过uv参数映射的圆环(f(u,v)和等式右边即为参数映射的公式)
点云实际上就是不直接表示几何的面,而是变成一堆点,而只要点足够多足够密,就可以直观的看到几何的表面了,点云方法可以表示任何几何,只要点足够多。本质上是存储一系列点三维坐标的列表。而人们也可以通过一些方法,把点云表示的几何还原成多边形面表示的几何。
多边形面表示法是图形学中应用最多的显式表示法,它把任何的几何都拆成三角形/四边形来表示,同时也是更为复杂的一种数据结构,包括不同的点,线,面的连接组成关系等等。
上图表示的是obj模型文件用文本方式打开的形式,也就是模型的一种存储形式。obj存储形式就是定义了模型所有的顶点坐标,纹理坐标,法线坐标,并且定义了那些顶点组成一个面,把它们组合在一起来表示一个模型。如上图中表示了一个立方体的模型:v代表顶点坐标,有8个有效值,,vn代表了6个面的不同的法线坐标,,vt则为纹理坐标,f则别代表了—连成三角形的点/纹理坐标/法线。
Lecture 10 Geometry 1 (Introduction)_哔哩哔哩_bilibili
Lecture 11 Geometry 2 (Curves and Surfaces)_哔哩哔哩_bilibili