隐式几何
- 任何空间中的一系列点,来表示一个面,但是不说这些点的具体位置,但是告诉你这些点满足一个关系。
- 类似给出一个数学意义上的公式
- 例子:三维中的一系列点都满足 \(x^2+y^2+z^2=1\),表面在半径为1的球体上。
问题:下图中的例子,满足下面该式子的点在哪些面上?
- 隐式几何的局限性,难以表示各个满足方程点的位置
- 但是已知一个点后,判断该点是不是在该平面上很方便,只需要带入方程即可
显式几何
- 表达出三角形面上所有点的信息
- 利用参数映射的形式表现。下图中遍历根据(u,v)坐标映射获得对应的空间点(x,y,z),获得平面
- 类似3维模型上的各个顶点,模型并不是每个面上的点都有数据(通过顶点插值获得)
给予一个点,怎么判断一个空间点在平面的内部还是外部?
- 显式表达的局限性,较难判断点与平面的关系
- 但是可以通过uv方程,映射获得所有在平面上的点
几种隐式几何例子
1、几何运算
- 图为几何间的运算获得的复杂结果
2、距离函数
-
对于任何一个几何,都不描述其表面,而是描述任何一个点到这个表面的最近距离(可正可负)。
-
由于有正负,我们获得了两个物体,再把这两个物体融合恢复,得到原来的物体。
如何得到这种blend的效果,就要从SDF即符号距离函数说起了(这里的符号是指距离可以有正有负)。
首先对于符号距离函数来说本质上就是一种定义距离的函数。如有空间任意一点到各个几何物体表面的距离,对这些距离做各种各样的运算操作最后得到的一个函数就是最终的距离函数了
距离函数的应用
假如一个物体挡住了A的1/3,然后该物体继续向右移动,获得图B,求A到B的线性过程。
对于这样一个二维平面的例子,定义空间中每一个点的SDF为该点到阴影区域右边界的垂直距离,在阴影内部为负,外部为正,因此对于A和B两种阴影来说的SDF分别如上图下半部分所示。有了SDF(A),SDF(B)之后对这两个距离函数选择性的做一些运算得到最终的距离函数,这里采用最简单的SDF = SDF(A)+SDF(B)来举例,最终得到的SDF为零的点的集合即为blend之后曲面,对该例子来说,就是两道阴影之间中点的一条线:
因此对于一开始的那个例子来说,只需合理定义空间中任意一个点的SDF,再令SDF为0即可得到混合的效果了。(tips:对于几何体混合效果自然不可能像这里简单的两个距离相加就可以得到了,该效果具体实现是找出任一个点到两个几何体表面距离中的最短距离再减去一个变量作为该点最终的SDF)
3、水平集
封闭式方程很难描述复杂的形状。替代方案:存储一个近似函数的值网格
在插值等于零的位置找到曲面提供对形状。
水平集的方法其实与SDF很像(像是SDF的一种特殊形式),也是找出函数值为0的地方作为曲线,但不像SDF会空间中的每一个点有一种严格的数学定义,而是对空间用一个个格子去近似一个函数,如下:
已知距离函数,怎么求原本的平面?
只需要吧F(x)=0的所有点都求出来即可
-
对该面内的每一个点利用已经定义好的格子值进行双线性插值(在纹理映射一节已讲解)就可以得到任意一点的函数值,找出所有=0的点作为曲面。
-
该方法的好处是对于SDF,我们可以更加显示的区空间曲线的形状。该方法广泛的运用在医学成像和物理模拟之中。
4、分型几何
- 分型几何是指许许多多自相似的形体最终所组成的几何形状。
- 如雪花是一个六边形,放大之后会发现每一个边上又是一个六边形,再放大六边形边上的六边形边上又是六边形,就这样无限套娃,有点递归的意思。
几种显式几何例子
1、点云
- 一组(x,yz)的点数组
- 只要点足够密集,点云能表示各种几何
- 点云经常用于转化成多边形的面
2、多边形表面(显式)
- 存储了一组向量或者多边形(三角形或者四边形)
- 容易处理、模拟
- 更复杂的数据结构描述
- 可能是在图形学中利用最多的
3、.obj文件
- 在计算机图形当中,简单来说通过定义各个多边形面的顶点以及顶点之间的连接关系就可以得到许许多多的三角形面或是四边形面,再通过这些面来近似表现出我们想要的模型效果。
- 上图是一个立方体的模型数据例子。
- 3-10行定义了立方体的8个顶点信息。12-25行定义了这些顶点的纹理坐标信息(每个面4个点,共6个面所以最多有24种不同的纹理坐标信息,这里有一些纹理对于不同面上的点是公用的)。27-34行定义了6个面的法线信息,为什么有8个是因为建模软件输出的精度问题不必在意,其中有两个是重复的
- 最重要的就是36-47行了,f 代表一个面,其中x/x/x的第一位表示是哪个顶点,第二位表示该顶点纹理坐标是第几个,第三位表示法线信息是第几个。 3个 x/x/x表示3个顶点的信息构成一个面。