曲线
1.Bézier Curves 贝塞尔曲线.
angents(切线)来定义贝塞尔曲线,规定了起点和终点必须是p0和p3,起始方向必须沿着p0p1方向,终点方向必须沿着p2p3方向
2. de Casteljau Algorithm(算法)
如何用任意多个点画出一条贝塞尔曲线
三个点的情况,假设t代表了时间t的时候贝塞尔曲线的点经过了时间t的位置,分别在三个点的取前1/3的位置的点相连,然后在连线上取1/3的位置标记点就是所求的点。四个点的也是同理,只要最后只能求到一个点的时候就是所求的点,只要枚举出所有时间的点,就可以画出这条曲线
3. 贝塞尔曲线的代数表示
当t等于0时,位置在b0,t=1时,位置在b1
总结:
可以推出代数式的诶个系数是由伯恩斯坦多项式得来的,常量就是b0到bn,系数感觉可以理解为(1-t+t)的n次方的结果的指数递减,最后一项的系数是t的n次方
4.贝塞尔曲线的性质
(1)必过起点、终点
(2) 起始点和终点的切线方向如图所示(根据点的数量系数会不同)
(3)仿射变换下:
对一条贝塞尔曲线的顶点做仿射变换再画出赛贝尔曲线
= 原曲线每一个点做仿射变换后得到贝塞尔曲线
(4)凸包性质:
①什么是凸包
一个直观的定义:把最外边的黑点看做钉子,用一条橡皮筋包住最外边的钉点,再松手,橡皮筋收缩后就是这个外框(凸包)
②性质
任何一个贝塞尔曲线的任意一个点,一定都在所给的控制点所形成的的凸包内。
一个例子:
几个点在一条线上 → 根据凸包的性质可知 → 凸包就是这条线(任意点都在凸包内)
5. Piecewise(逐段) 贝塞尔曲线
(1)为何引入逐段贝塞尔曲线
控制点多的时候 → 不好控制曲线 → 用少的控制点定义多条贝塞尔曲线,再连起来。
(2)两段曲线相连的连续性
C0:仅仅是两段曲线相连,也就是值相同
C1:相连处到相邻两个点的切线方向相反,长度相同
后面还有更高级的,就不多说了
曲面
1.贝塞尔曲面
四条贝塞尔曲线上面相同时间t可以得到四个点,这四个点又可以当作另外一条贝塞尔曲线的控制点,进行扫描之后就得到了贝塞尔曲面,总之就是竖着的四列连接出贝塞尔曲线后,再横着根据t依次连接成一条线
2.Mesh Operations: Geometry Processing
Mesh subdivision 网格细分
Mesh simplification 网格简化
Mesh regularization 网格正规化(基本都是规律的三角形)
3.Mesh subdivision 网格细分
网格细分的目的主要是进行三角形或者多边形细分,让物体表面变得更加光滑
1.Loop Subdivision
取每条边的中点相连分成四个三角形
调整新生成的顶点和原来的顶点的位置
对于新生成的顶点,肯定被两条边所共享,共享的这条边的两个顶点占的位置影响比重显然更大。
对于原来的顶点,定义两个变量,n就是顶点的度,也就是每个点连接的边的个数,,u就是和n相关的一个数,根据公式可以看出来1-n*u的结果貌似是唯二的,n=3的时候,等于7/16,不等于3的时候等于5/8,很明显相连的边越多,n越大,u越小,周围的点越不重要
细分结果:
2.Catmull-Clark Subdivision
定义:
quad face:四边形面
Non-quad face:非四边形面
Extraordinary vertex :奇异点(degree != 4,即度不为4的点- 度:连的边数)
细分操作:取每条边,每个面的中点 → 连起来 → 结果:每个非四边形都引入了一个奇异点,非四边形面消失
Catmull-Clark Subdivision的性质:在一次操作后,增加了非四边形面数的个数个奇异点,并且后边都不回再增加了。
如何更新新增加的点:
4.Mesh Simplification 网格简化
目的就是减少三角形的数量但也要尽量保持原来的形状
1.边坍缩—Edge Collapsing
但是应该坍缩哪条边,以及坍缩出来的点应该放在哪里呢,这里要用到二次误差度量,对于新捏出的简化后的一个顶点,也就是下图中的蓝色的顶点,我们找到影响它的各个面,把该顶点与各个面的距离的平方和求出来,平方和最小的这个位置也就是最优位置。
怎么确定坍缩哪条边呢?这里同样用到二次误差度量,在一个网格中,我们对每条边都做一次二次度量误差,也就是说对每条边坍缩后对网格的整体影响做一个预计算并排序,那么开始坍缩的时候,先从那条二次度量误差最小的那条边做坍缩。
但是我们每坍缩一条边之后,会对其它边的二次度量误差产生影响,也就是说,每坍缩一条边之后,我们的其它边坍缩后的对网格的影响要重新计算。也就是说我们需要一种数据结构,我们能瞬间取到最小值,也就是O(1),并且我们能动态的更新重新排序剩下的受影响的数据,也就是优先队列/堆。这也就支持了我们每次取二次度量误差最小的边进行坍缩,然后再取受影响之后的二次度量误差最小的边进行坍缩,然后循环往复的过程。
实际操作
补充:阴影
光栅化阶段的一个东西,Shadow mapping,
传统的Shadow Mapping只能处理点光源/方向光源,这种光源产生的阴影一般会有明显的边界,也就是硬阴影,也就是说一个点要么在阴影中,要么不在阴影中,非0即1的一个过程。其次,Shadow Mapping 会产生阴影的走样问题。
过程1:
1.如何判断一个点或者像素是否再阴影里?
在相机的角度可以看到这个点,但是在光源的角度看不到这个点。也就是说光源记录的这个点的深度和相机记录的这个点到光源的深度不一样
2.实际操作
第一步 :从光源看向场景进行一次光栅化,只记录深度
第二步:从光源看向场景,观察每个点投影回光源所在的成像上,对比摄像机观察到的点到光源的距离和光源记录的深度,深度一样,说明能看到,反之就是在阴影中
实例分析:
第一步光源出发得到深度图
第二步,对比深度后的结果图,看到的图很脏是因为浮点数的精度原因,其次第一步中得到的深度图的分辨率也会影响质量,所谓的阴影质量就是第一步深度图的分辨率大小
3.结果图
3.软阴影和硬阴影
软阴影的阴影有过渡的过程。点光源是不会产生软阴影的,软阴影的存在要求光源有一定的大小