目录
现实中的细毛发,衣服,光滑曲面,以及水面在计算机中我们怎么表达?怎么描述?以及很大场面,我们怎么优化渲染这么多物体?
在计算机图形学里,我们有两种几何的表述:
- 隐式表面
- 显示表面
显示曲面
使用三角形直接给出或者平面上uv映射的方法定义一个曲面,就是我出入一组平面的u v ,就可以得到对应的( x, y, z)
缺点:就是很难判断一个点是否在曲面上
好处:代入每一个uv就可以形成曲面的样子
点云
就是一堆点的组合,由点很密集的集中在一起,组成图形,如果物体很复杂,点需要很多很多,
三角形表示
由三角形组成的物体,这是最广泛运用的形成物体的方法
其中有一种文件.obj格式的,描述物体,定义了所有的点,法线坐标,纹理的uv坐标,和那些点组成一个三角形,左上的是所有的点,左下的是对应点的uv纹理坐标,右上是法线,右下是哪些点组成三角形以及点的纹理坐标和面的法线
隐式曲面
就是一组满足某关系的点的集合,他不告诉你点的位置,只是告诉你这些点满足的关系
f(x, y , z) = 0
缺点:很难知道这个隐式曲面表示的图形是什么样子的,很难找到所有的点
好处:判断一个点在曲面上非常好判断
距离函数
距离函数(Distance Function)是一种用于隐式表示几何形状的方法。它通常被称作Signed Distance Function (SDF),即有符号距离函数。SDF是一个标量场,对于空间中的每一点,它返回该点到最近的表面的距离,并带有正负号以区分该点是在表面的外侧还是内侧。
下图就是示意,每一个点都存着最近平面的距离,其中距离为0的位置连起来就是我们的平面,正数为平面外,负数是内部
这种表示平面的方法很适合两物体融合在一起,比如水花,物体交接处的平滑过渡,就是Blend
贝赛尔曲线
这是显示表示(参数)
原理:
使用一系列的点定义曲线 ,下图,三个点怎么定义一个曲线出来呢?首先一定有的就是,曲线的起点一定切与b0 ,终点切与b2
贝赛尔算法:
从起点开始,在线段上取一个点时间 t , 起始时间0 终止为1 ,只在一个线段上移动(b0 到 b1 ), 我们只需要找到t取每一个值时候,点的位置就行了
假如你要找t = 0.3 的时候,曲线的点位于哪里,那么在每一个线段上找到 三分之一的点,连起来,继续找新连起来的线的三分之一的位置,连起来,知道找到最后,三分之一处只有一个点的时候,这个最后的点就是t = 0.3 时曲线的点的位置
数学原理
这原理就是很多次线性差值,开始所有的点相邻的线性插值得到一个点,依据是 t 的大小,之后向上推,最后得到一个点就是我们要的
对于三个点的贝赛尔曲线数学计算:
不难看出,最后要求的点关于时间 t 的表达式前的系数满足二项分布的,最后得到伯恩斯坦多项式
比如四个点最后得到的曲线上的点随 t 的位置表示就是:
曲面
细分三角形
做的事情就是:
- 增加三角形的数量
- 移动稍微少的三角形使得原来的物体边的更为的光滑
Loop 细分
先细分后调整
增加数量上,连接各边中点参加三角形数量
怎么移位置:对于图中的新点,只要是两个三角形公用的,最后坐标:
老的点,根据度数和加权,计算最后的坐标:
Catmull细分
先定义两个概念
- 奇异点:度不是4的
- 非四边形面:边数不是四边的就是
Catmull细分方法就是:
去每一个小面每一个边的中点和面的中心,连起来就行了,这样就没有非四边形了,但是多了非四边形数量的奇异点
其中每一个面中心的点和边的中点最后调整的坐标是:
原来的点调整之后的坐标就是下图推演出来的
减少三角形
在不同场景下, 我们可以使用不同细分度的模型
做法就是“拉点”,这方法叫做edge collapsing , 边坍缩
就是把两个点拉到一起,删除边,那我们怎么选择两个点呢?哪些边不重要,我们可以坍缩掉哪些又不可以
我们先理解一个新概念:二次度量误差,就是你删除其他点之后,新的点需要放在什么位置,
答:这个位置距离你删除的点组成的面的距离的平方和最小
局部上的坍缩就是怎么做的,那对于一整个物体,我们怎么减面的数量?首先初始时,先给每一个边设定好最小度量误差,然后使用优先队列,每一次取出二次度量误差最小的边,去掉它,再更新与这个边有关的其他边的二次度量误差,一直重复
Shadow Map
光栅生成阴影的方法,一般只可以处理点光源,处理点光源生成的硬阴影
做法:
- 在点光源的位置我们进行光栅化,但是不生成图片,只记录光栅时候每一个像素的最近的深度信息
2.从真正摄像机观察的时候,假如我们一个像素观察的点是a,那么,记下a到光源的距离L,再将这个点投影到光源光栅的屏幕上,将L与投影后对应像素之前记录的深度信息比较,大于之前记录的,说明是阴影,就可以搞黑色的影子了
但是这就有一个问题,由于浮点数的精度问题,一个像素投影到场景后,可能会覆盖很宽的范围,这个范围中实际距离光源的深度可能不一样,这就会出现问题,还有就是光源处的光栅我们搞多大的像素呢?这些都有办法解决的,以后研究研究