在图形学中如何描述几何的形体呢?有两种表示几何的方式:隐式(implicit)
几何、显式(explicit)
几何。两种表示方式都有各自适宜的使用场景。
个人理解隐式几何是给定一个关系(函数),不具体制定哪些点。而显式的几何是给定具体的点。
implicit geometry
隐式几何
不具体指定几何上的点,而是给定一个关系(函数),满足这个关系的点就在几何上。 比如说一个球面:。从更加通用角度,给定一个函数,满足这个函数的xyz就是这个几何上的点。
通过隐式几何的方式描述几何的好处:
- 给定任意点xyz,可以方便判断这个点是在几何表面、还是在内部或外部;
通过隐式几何的方式描述几何的不足:
- 无法给出几何上的所有点,因为是无穷的。
- 直接从函数上很难看出几何的形状
explicit geometry 显式几何
显示几何表示我们能直接或间接的获得几何上的所有的点。
explicit geometry
是:
- 是直接给出所有几何上的点
- 给定一个映射关系,
直接给出所有的点很好理解,映射关系怎么理解呢?假设给定一个UV坐标集,对于UV坐标集中的每一个点,都有一个映射函数f(u,v),得到空间中的一个点;
映射也是用函数来表示的,为什么又是显示的哪?这里是指对于任意一个点UV,通过映射方程,我都可以得到空间上的一个点,也就是说几何上的所有点我都可以知道,所以是显示的。
显示几何的优点是直观、可以得到几何上的所有的点。缺点是难以判断任意一个点是否在几何表面/内部/外部。
more implicit geometry in graphics
algebraic surface
constructive solid geometry
简称CSG,是通过基本几何的基本运算(交并差)得到最终的几何。
就是常用建模软件中实体布尔运算的操作。
distance function
通过距离函数来表示几何,距离函数通常被用来表示一个对象表面上每个点到某个参考对象(例如一个几何体)的最短距离。 距离函数经常与blend融合操作结合起来,表示复杂的形状。
这里并不理解老师讲的内容
level set methods 水平集
fractil
物体的细节是自相似的。
more explicit geometry
- triangle mesh :
- bezier surface
- subdivision surface
- nurbs
- point clouds
point clouds
不考虑几何形状,直接用大量的点来表示
polygon mesh
最常用的表示方法,存储点和三角形。
curves
想想我们用笔在纸上绘制一条曲线,一条曲线是一系列的点,这些点以时间为参数。
bezier curve 贝兹曲线
我们在很多地方都能看到贝兹曲线,比如PS的钢笔工具、一些建模软件中。从使用上来看,通过拖动节点或改变节点的方向来控制曲线。
贝兹曲线从几何上来看:给定d+1个控制点,就能得出d维的曲线, 以下图中为例进行说明:有p0~p3这4个控制点,贝兹曲线满足:
- 曲线起点为p0,终点为p3,
- 曲线的起始和终止的切线方向分别为p0p1、p2p3
从几何上如何绘制贝兹曲线呢?通过casteljau算法,基本原理是以t为参数,0<t<1,对于每一个t,都可以一个映射函数(递归获取)得到贝兹曲线上的一个点,最终就可以画出所有的点,我们就得到了贝兹曲线。
PS:casteljau算法用文字不太好描述,还是直接看视频吧。
从代数上贝兹曲线可以用伯恩斯坦(bernstein)多项式来表述:
B-spline B样条曲线
mesh
从几何处理角度,网格操作分为:
- 网格细分
- 网格简化
- 网格规则化:使网格上的面尽量平均大小
网格细分 mesh subdivision
网格细分的目的是增加网格模型的细节,同时使过渡尽可能的光滑。 对于网格细分操作来说,通常分为两步:1. 创建更多的三角形(顶点) 2. 移动顶点的位置
loop subdivision
loop subdivision
是一种常用的,对三角形面网格进行细分的方法; loop subdivision
的基本思想是把一个三角形一分为四,然后根据权重对顶点位置进行偏移。 其中对于新添加的点,权重关系如下: 对于之前存在的点:
catmull clark subdivision
loop subdivision只能用于处理三角形网格,catmull-clark subdivision
方法更加通用,可以用于处理任意的网格。 catmull-clark subdivision
方法基本思想是通过在网格面内部及该网格的边界中心点各添加一个顶点,并通过一定的规则移动顶点的位置,使得细分后的曲面光滑。 对于细分后的网格如何修改顶点的位置,对于不同的顶点,有相应的规则:
网格简化
网格简化是一个很常见的需求,为了提高渲染的性能,我们需要在离相机远的地方显示面数低的模型,在离相机近的地方显示细节程度高的模型。
一种网格简化的方法,边坍缩,边坍缩的方法从直观上看:像下边这幅图,删掉中间的边,然后把边的顶点聚拢在一起。 注意,当删除一个顶点时,与顶点相关联的边都需要进行移动。 边坍缩的方法直观上很好理解,但实际上如何操作呢有几个问题需要考虑:
- 我们应该选择哪些边(顶点)进行坍缩
- 坍缩后又如何修改顶点的位置,并尽可能使简化后的模型不丢失太多的细节。
一种做法是采用quadric error metrics
(二次误差度量),所谓quadric error
是计算边坍缩后增加的新的顶点的位置,使得其与受影响的几个面的距离平方的和最小。这种方法的基本思想是是通过计算所有边的计算二次误差,进行排序,然后从二次误差最小的边开始进行坍缩。