目录
隐式表示
代数曲面(Algebraic surfaces)
CSG(Constructive solid geometry)
距离函数(Distance Functions)
水平集(Level set methods)
分形(Fractals)
显式表示
点云(Point Cloud)
多边形网格(Polygon Mesh)
模型文件Object File (.obj)
隐式表示
几何的隐式表示就是用一个函数式子来表示一个几何体,像一个球可以表示成x²+y²+z²=1,即可以用f(x,y,z)=0这样的函数关系来表示,f=x²+y²+z²-1
这样这个隐式表示对于任何一个点计算出f的结果就可以知道这个点是在几何体内部还是外部,如果f的值小于0,我们就把它当作在几何体内部,如果大于0,就当作在几何体外面,当然如果等于0那就是在几何体表面
但是这个隐式表示有一个它的缺点就是很难知道有哪些点在这个几何体上
相对而言要知道某一个点和这个几何体的位置关系就很简单,只需要带入f计算就行
隐式表示方法有这个代数曲面(Algebraic surfaces)、CSG(Constructive solid geometry)、水平集(Level set methods)和分形(Fractals)
代数曲面(Algebraic surfaces)
就是可以用一个简单的多项式式子可以表示几何体,但是对于复杂的形体就很难表示了,像这个球体、圆环体还有这个心形都可以用一个简单的式子表示出来,但是这头奶牛呢?
CSG(Constructive solid geometry)
这个CSG就是用一些基本的几何体通过一些基本的布尔操作组合出来几何体,简单的通过这个并、交、差来形成不同的几何体
距离函数(Distance Functions)
所谓距离函数,指的是这样一个东西,对于空间中的点,我都给他计算出一个值,这个值是这个点到这个几何体表面的最短距离,并且如果这个点在几何体表面外,这个距离为正,在几何体表面内,这个距离为负,这个可以用来实现两个物体的融合过程
注意这个融合过程,比较不好理解,我查了很多资料目前还是一知半解,先讲一个简单的融合边界问题,有这个A和B,SDF是Signed Distance Function,就是带符号的距离函数,这个A的边界在三分之一处,B的边界在三分之二处,那么SDF边界距离当然是0,然后往两边是负数和正数走,这个融合这里就简单相加,那么新的边界会出现在中间,那这个就是边界融合后的效果
具体到两个物体的边界融合,空间中点的距离取到两个物体表面的最短距离再减去一个值作为这个融合后的SDF,那么当两个物体之间的距离小于某个值,那么这两个物体就会开始接触
实际操作可以看这个的实现 Combination SDF (shadertoy.com)
水平集(Level set methods)
这个水平集和SDF基本一样,也都是表示这个距离的方式,可能SDF的式子不好找,但是这些离散点的距离值还是可以知道的,那就记录下来,类似于等高线,是用双线性插值出来为0的地方就是物体的表面
分形(Fractals)
这个分形几何说的是这样一种几何体:部分和整体很像,跟递归一样,比方说这个西兰花,它的一小块和它本身长的差不多,一小块的一小块又和一小块差不多,那这种分形就很容易出现这个走样的问题
显式表示
对于一个几何体的显式表示,就是说我们可以知道有哪些点是在这个几何体上的,比如说把所有的几何体上的点都给出来了,或者说通过一种参数映射的方式,就是给一个(u,v)到(x,y,z)的一一映射,那我可以确定这个几何体上的点,这个就是显示表示
那自然我想要知道哪些点在这个几何体上这个事情就很容易知道了
那什么事情变得困难了,要知道某个点在不在这个几何体上,在里面还是外面?这个事情变得困难
点云(Point Cloud)
这个几何体可以直接通过一堆点来表示,叫点云,如果一堆点采样足够高,看起来就会像是一个物体的表面
多边形网格(Polygon Mesh)
通过把一个复杂的几何体拆分成多个三角形组合而成,这是最常用的方法
模型文件Object File (.obj)
存储模型的文件,obj文件,比方说一个正方体物体,有8个顶点,那么会存储下8个顶点的位置,如3-10行的v,然后会有六个面,会记录下每个面的法线,如27-43行的vn,这里不止6行是因为有冗余,存在数据重复,还有每个三角形顶点的纹理12-25行,剩下的f行是记录渲染的三角形的三个顶点,例如1/2/3,说的是第1个顶点,用的第2个纹理,用的第3个法线,即(顶点,纹理,法线)
不知道对不对哈,闫老师说的我有点怀疑,然后我去搜了一下,综合各种资料,vn确实是面法线,vt是纹理坐标,正方体就是有14个纹理坐标,因为正方体展开就是有14个顶点