图形学基础-几何Geometry-显隐曲面-贝赛尔-loop&Catmull细分-ShadowMap

目录

显示曲面

点云

三角形表示

隐式曲面

距离函数

贝赛尔曲线

原理:

数学原理

曲面

细分三角形

Loop 细分

Catmull细分

减少三角形

Shadow Map


现实中的细毛发,衣服,光滑曲面,以及水面在计算机中我们怎么表达?怎么描述?以及很大场面,我们怎么优化渲染这么多物体?

在计算机图形学里,我们有两种几何的表述:

  • 隐式表面
  • 显示表面

显示曲面

使用三角形直接给出或者平面上uv映射的方法定义一个曲面,就是我出入一组平面的u v  ,就可以得到对应的( x, y, z)

f : R^{2} \mapsto R^{3}; (u,v)\rightarrow (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

光栅生成阴影的方法,一般只可以处理点光源,处理点光源生成的硬阴影

做法:

  1. 在点光源的位置我们进行光栅化,但是不生成图片,只记录光栅时候每一个像素的最近的深度信息

2.从真正摄像机观察的时候,假如我们一个像素观察的点是a,那么,记下a到光源的距离L,再将这个点投影到光源光栅的屏幕上,将L与投影后对应像素之前记录的深度信息比较,大于之前记录的,说明是阴影,就可以搞黑色的影子了

但是这就有一个问题,由于浮点数的精度问题,一个像素投影到场景后,可能会覆盖很宽的范围,这个范围中实际距离光源的深度可能不一样,这就会出现问题,还有就是光源处的光栅我们搞多大的像素呢?这些都有办法解决的,以后研究研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值