补充
环境映射(Enviroment Mapping)
//具体应用见入门精要第六章
cubemap是 环境映射(Enviroment Mapping)的一种实现方式
cubemap将一张扭曲的HDRI贴图映射到球面上
其球面上实际储存的是下图中的六张矩形图形
凹凸贴图
//具体应用见入门精要第七章
可以通过高度贴图定义任意一顶点,任意面与原模型的相对高度(高度方向为法线方向)
高度贴图会使法线发生变化,进而使shading结果发生变化
无论是高度贴图还是法线贴图,看引擎内给予模型进行采样的是哪个贴图,无论是高度还是法线贴图,都是通过颜色的不同对应模型法线强度的不同
改变了法线
计算法线(2D)
使用高度贴图得到切线
由切线得到法线
法线需要归一化
计算法线(3D)
贴图如何影响法线
通过UV变化,得到倒数
再计算出法线
位移贴图真正的改变了模型顶点的世界坐标位置,对模型要求高
纹理更多的作用
三维纹理
纹理可以添加AO
几何
隐式几何
没有具体的几何,仅有几何满足的关系
比如方程式(圆球的方程式)
可以判断点,面是否存在于隐式几何之中
几种隐式几何
代数曲面
Constructive Solid Geometry
CSG指的是可以对各种不同的几何做布尔运算,如并,交,差(布尔?)
通过这些操作可以得出各种更为复杂的几何
通过CSG的方法可以一定程度上缓解隐式曲面难以表现复杂形体的困境。
符号距离函数(Signed Distance Function)
还可以通过距离函数来得到几何形体混合的效果
空间任意一点到各个几何物体表面的距离,对这些距离做各种各样的运算操作最后得到的一个函数就是最终的距离函数
定义空间中每一个点的SDF为该点到阴影区域右边界的垂直距离,在阴影内部为负,外部为正,因此对于A和B两种阴影来说的SDF如上图所示。有了SDF(A),SDF(B)之后对这两个距离函数选择性的做一些运算得到最终的距离函数,这里采用最简单的SDF = SDF(A)+SDF(B)来举例,最终得到的SDF为零的点的集合即为blend之后曲面,对该例子来说,就是两道阴影之间中点的一条线
水平集(Level Set)
水平集的方法其实与SDF很像,也是找出函数值为0的地方作为曲线,但不像SDF会空间中的每一个点有一种严格的数学定义,而是对空间用一个个格子去近似一个函数
等高线
对该面内的每一个点利用已经定义好的格子值进行双线性插值就可以得到任意一点的函数值,找出所有=0的点作为曲面
分型几何(Fractals)
指许许多多自相似的形体最终所组成的几何形状。
显式几何
直接给出几何/通过参数映射出几何
几种显式曲面
点云(Point Cloud)
很多的点构成的曲面,直接有着所有点的信息,点多模型细节就多,点少模型细节就少。、
不考虑物体是一个表面,而是表面为一堆点,只要点足够密集,就看不到点与点之间的缝隙
多边形网格(Polygon Mesh)
通过定义各个多边形面的顶点以及顶点之间的连接关系就可以得到许许多多的三角形面或是四边形面,再通过这些面来近似表现出我们想要的模型效果。
建模中常见
贝塞尔曲线
贝塞尔曲线是需要一系列的控制点去定义某一个曲线,这个曲线满足一些性质,比如下图的要沿着切线方向
计算二次贝塞尔曲线(de Casteljau 算法)
定义三个点
根据任意的 t 插值出点
不断重复
t在[0,1]间不断取值,这样得到一条贝塞尔曲线
计算三次贝塞尔曲线(de Casteljau 算法)
类似递归的算法
定义四个点
不断取中值,找到t,连线
使用代数表示
计算三次贝塞尔曲线的过程中,在每两个之间找一个时间t,相当于每两个之间线性插值
代数形式
b^1(t)=b0+t(b1-b0)——>b^1(t)=(1-t)b0-tb1
推广到n次
描述二项分布的多项式
三次贝塞尔曲线的公式效果如下
性质
第三条:在仿射变换下,只需要对顶点做仿射变换,就能得到这个贝塞尔曲线在仿射变换下的结果第四条:贝塞尔曲线在控制点形成的凸包内
凸包:保卫控制点的最小凸多边形
类似橡皮筋
逐段贝塞尔曲线
控制点多了以后,贝塞尔曲线并不直观,很难控制
于是我们想到每次定义一段贝塞尔曲线,然后连起来,普遍习惯每四个控制点定义一段
钢笔工具
共线光滑
连续性
C0连续,点相同
C1连续,切线相同
样条曲线
样条——连续的曲线,由一系列控制点控制,满足一定的连续性,也就是可控的曲线
B样条,也就是basis 基函数
具有局部性
曲面
贝塞尔曲面
画出四条贝塞尔曲线后,在这四个线上再取四个点
根据时间t,点不断移动
连接点形成贝塞尔曲线
线扫过的面便是贝塞尔曲面
计算贝塞尔曲面
通过参数映射把 u v 分别映射成 t
几何处理
网格细分
Loop 细分
创造更多的三角形,并且改变他们的位置,让表面更光滑
连接各边中点,创建三角形。区分出新老顶点再处理
对于新的顶点(白色的顶点),会按照如下的公式调整位置
对于旧的顶点,一部分靠周围旧的顶点的值,一部分保留自己的,按照公式移动位置n为顶点的度(连接的边的数量)u为一个和n有关的数
结果
Catmull-Clark 细分
Loop细分假设的是三角形网格,但是对于非三角形网格,就没办法,这时候就要用到Catmull-Clark 细分。
可以定义四边形面以及非四边形面。如果度不为4的点,定义为奇异点
一次细分的过程
取边上的中点,以及面上取一个点(重心或者其他的),把这些点连起来
在这个过程中,引入了两个度为3的奇异点(在两个三角形中点的点),所以一共有4个奇异点
在这个过程中,所有的面都变成了四边形面
也就是一次细分后,每一个非四边形面消失,并会引入一个奇异点
也就是之后的细分,不会再增加奇异点数目了
继续细分,奇异点不变
点的位置的调整,分为三类
新的点分为 面上的点
边上的点 分别操作
老的点单独操作
两种细分方式对比
网格简化
一种网格简化的方法 边坍缩
应该如何坍缩保证轮廓基本一致?
左下为五个点平均,右下为二次误差度量
二次误差:坍缩后的点和原本几个边(面)的距离的平方和最小
每一条边都假设,如果坍缩它,会导致多大的二次度量误差然后从二次度量误差最小的开始坍缩,从小到大
但是存在一些问题
坍缩一条边可以,但是坍缩一条边之后,其他边也跟着改变了,这些 改变了的边 的二次度量误差也得重新计算
所以我们需要从二次度量误差中选最小的,取完最小的之后,我们要对它做更新
这种数据结构要能让我们能取到最小值,同时也能动态更新其他受影响的元素
这种数据结构也就是 优先队列/堆
并且我们通过对局部进行最优解,试图找到全局的最优解,也是一个典型的贪心算法