前言
几何的介绍和入门。
一、几种表示几何的方式
几何的隐式表达方式(“Implicit” Representations of Geometry)
基于分好类,点和点之间满足特定关系多个点来表示。
上图用函数表示了三维空间中的球体的所有点。
或者推广一下,几何表面所有的点都满足函数f(x, y, z) = 0。上图中表示一个二维的f(x, y) = 0表示的几何。
隐式几何表面的采样可能会非常困难。比如上面那个表示一个圆环,但是连看都看不出来更别说采样了。
相对的,判断一个点在几何表面的里面,外面还是表面就很简单,x, y, z代进去就可以知道了。
几何的显式表达方式(“Explicit” Representations of Geometry)
将面上所有的点都直接表达出来或者通过参数映射(Via Parameter Mapping)。
参数映射,简单来说,通过一个函数,将u, v中的点映射到三维空间x, y, z中来表示三维几何体(想想《三体》里的降维打击)。
如上图所示,在参数映射的情况下,要采样很简单(直接把点给出来就更简单了)。只需要将u, v的值代进去就可以了。
相应的,判断一个点在几何体内还是外就变得很难了。
所以说,没有最好的表示方法,几何学是很难的。
二、隐式的几何表示方法介绍
代数曲面(Algebraic Surfaces)
直接用数学公式表示,几何体表面用某个x, y, z多项式为0时的值来表示。他最大的问题就是一点都不直观,你不能直接看出那个公式到底表示了个什么东西。也不能直接知道一个东西要用什么样的公式去表示。
实体几何构造法(Constructive Solid Geometry, CSG)
通过对多个基本几何体的Bool运算来组成新的几何体。
距离函数(Distance Functions)
距离函数描述任意一个点到达几何体表面的最小距离(可能是带符号的 比如说在内部的点就是负的)。
通过距离函数可以将两个几何体表面逐渐混合起来。
上图是运用距离函数的一个例子,假设一个物体挡住了A中显示的三分之一(阴影部分),移动以后又挡住了B中显示的三分之二。我们希望求出物体从A到B的一个中间状态。
如果直接把A, B相加,得到的一个左边黑,右边白中间灰的效果,这不是我们想要的。我们想要一个在中间有明确边界的效果。
我们使用带参数的距离函数(Signed Distance Functions, SDF)。得到A的函数结果和B的函数结果,如果将两个函数结果混合起来(将相加嘛),得到的就是第三个图的结果,将第三个图恢复成几何体,就可以得到一个有明确边界的结果。
通过上面的例子,我们可以知道,可以混合两个距离函数。得到的新距离函数函数值为0的地方就是新几何体的表面。
水平集(Level Set Methods)
当距离函数不太好写出来时,可以利用水平集方法,水平集用离散的格子来表示不同的值,要表示几何体表面只需要找到格子中插值是0的位置就行。和地理上的等高线很像。也有点类似纹理。
水平集不仅可以是二维格子,还可以是三维格子,就和纹理很类似了。上图,假如是我们有人体内的三维点的密度值,那我们可以根据密度值利用水平集的思想得到人体的三维几何体表面。
还可以利用水平集思想进行物理模拟。
分形(Fractals)
分形有自相似的意思,也就是一个物体的一部分和他的整体非常相似。思考一下编程里面的递归。这是一种表示某些自然现象的方法。
三、显式的几何表示方法介绍
点云(Point Cloud)
点云就是用一堆数量足够多的点来表示物体表面,简单来说,大力出奇迹。点云本质上就是点的列表。为了实用,点云最后都会转变成多边形面。
点云常见于仪器扫描出的结果。
多边形网格(Polygon Mesh)
多边形网格常见于建模工具中,是目前图形学中最常见的几何显式表示办法,通过保存顶点和多边形面来表示几何物体,很便于对几何物体做处理,适用于采样。
上图为.obj格式文件,.obj文件就是一个专门描述顶点,法向量,纹理,坐标和他们之间的联系的文本文件。
课程的最后
总结:
- 隐式函数不好定义但是很好查询(以及存取)。
- 隐式函数很好做光线和表面的求交(光线追踪篇)。
- 隐式函数很好处理拓扑结构的变化。
- 隐式函数很难去建模复杂形状。