11.1 显式表示几何
1、点云
就是很多密集的点,只要足够密集。可以研究成三角形面。
完全也可以用三角形表示复杂物体
11.2 曲线
1、Bezier曲线
非常丝滑,因为每一个点都是唯一确定的。
该曲线一定经过起止点,p0p1的切线、p2p3的切线
2、de Casteljau算法
(1)如何画出Bezier曲线?
假设b0是时间0,b2是时间t,b1决定往什么方向弯。
假设 t = 1/3,取得左侧线段的1/3处b01,右侧线段的1/3处b11,连接两点得新线段的1/3。
(2)Bezier二次曲线推导公式
像完全平方公式a^2 + 2ab + b^2, 其实二次曲线的公式就是由各个控制点bi的线性组合,线性组合的系数就是(a+b)^ n 的二项展开式。
当是n次曲线时,最终曲线的表达式是各个控制点的线性组合,组合的系数是二项展开式。
三维空间中也可以使用伯恩斯坦多项式,注意4个点0123时,n = 3,
(3)Bezier曲线有一些不错的性质
假设现在是有4个点
性质1:起点t=0的值一定是b0,终点t=1的值一定是b3
性质2:起点处的切线等于求导值,前面的3是因为C(n,1)的那个系数公式,n=3。前提若不是4个控制点,则不必是3。
性质3:拉扯控制点得到的新Bezier曲线,跟使用这些点画的Bezier曲线(仿射变换==线性变化+平移)一定是一样的。好的应用:在对一条Bezier曲线进行放射变幻时,不必将全部的点都记录下来,只需要对控制点做仿射变换再画出来即可得到新曲线。
性质4:凸包性质。画出来的曲线一定在控制点形成的凸包内。
什么是凸包?能包围给定形体的凸多边形。皮筋包住钉子的外框。
(4)分线段的Bezier曲线
针对有时候不太方便用很多个顶点得到想要的形状的情况,提出分线段的Bezier曲线。
连续性:
C0连续:两点连接
C1连续:一阶导数连续
3、样条曲线 B-splines
样条定义:一条连续的曲线,是由很多控制点控制的,能满足一定的连续性。一条可控的曲线就是样条。
B-splines就是basic-splines,比起Bezier曲线需要更多的信息。
Bezier曲线的数学公式理解,既可以是二项式定理作为系数对各个顶点作加权平均,也可以理解成各个顶点的位置对二项式系数做加权平均。
由于Bezier曲线是一个顶点发生变化,整个曲线就会变化,我们希望顶点有局部性影响曲线的功能。使用分段Bezier曲线也可以实现,但是B样条曲线也有这样的好的性质。
NURBS是B样条的更进一步延伸。
11.3 曲面
1、Bezier曲面
假设有16个点,先生成4条Bezier曲线,然后让蓝色点在时间t上移动,得到新的Bezier曲线的四个控制点,编织成的Bezier曲面。
在原始的4条线运动到时间u比例,在形成的蓝色曲线运动到了时间v的比例,唯一确定黑点坐标(u,v)。
也就是坐标u确定一条Bezier曲线,v确定曲线上的某一个点。
2、三角形与quads四边形 -- CAE工程师?模型师?
涉及到了更多的网格操作,曲面细分、曲面简化、平滑、参数化,得到的模型。
(1)曲面细分
可应用于纹理贴图,之前相对位移移动生成高度差,应用在不同的顶点上,引入更多的三角形,得到新的更高质量模型。
loop 这个人的细分算法:
三角形的三边中点增加三个新的点并连接,根据权重更新新的点的位置,原来旧的点的更新方式与新的点的更新方式不一样。
新的点取加权平均
对于旧的顶点:一方面认为自己是重要的,另一方面也考虑其他顶点的加权平均。这个公式是当周围顶点多的时候,认为自己不够重要,反之权重大。
定义一个顶点的度,现在就是n=6。
再定义一个数u,u是一个跟度相关的数字,如果n=3,则u=3/16,其他情况u=3/8n。
此处n=6,得u=3/86=1/16。
得权重的公式:(1-nu) self + u * neightborhood
= (1 - 6 * 1/16)*self + 1/16 * neightborhood = (10/16)xxxx
Catmull-Clark细分算法
奇异点定义:度不为4的点
连接三角面的面中心与三边中点,经过一次三角形细分可能会引发新的奇异点,所有非四边形面都消失了。原来有多少非四边形面,经过一次细分会编程多少个新的奇异点。
再经过一次细分,原来没有非四边形面了,所以也不会有新的奇异点产生。
Catmull-Clark这种算法新增的点又分成面心点与边心点两种,再加上old点,更新方式不同。
面心点:平均周围一圈4个old点
边心点:平均周围一圈2个old点+2face点
old点:平均周围新的4面心点+4边心点+8old点
loop细分只能用于三角形面,但是catmull细分可以用于不同形状的面。
(2)网格简化
Collapsing An Edge边坍缩算法
确定应该收缩哪些边?Quadric Error Metrics二次误差度量
在左侧的图是取各个顶点的平均,但是蓝色点与原来的点高度误差非常大,不好。
右侧的二次误差度量:新顶点的应该是,到达相邻的三角形面的距离和最小的位置。
这里复杂的计算过程可看https://max.book118.com/html/2017/0511/105908876.shtm。
其实就是计算的新顶点u到原来顶点u1、u2所连接边集(相连的全部边的距离)的距离和。
如何用二次误差度量来选择边坍塌?
假设有一条边坍缩后,通过移动合并处顶点的位置,得到误差最小的位置。
1、计算每一条边坍塌下的误差值,进行堆排序、贪心算法,选择误差最小的边开始进行坍缩。
坍塌时会导致周围边的误差发生变化?
2、以最小的代价更新,对受影响的边做更新最小二次误差。
1、2步骤是要求我们允许取最小,并更新受影响,使用堆结构。
乱入一只可爱牛牛
(3)阴影问题--shadow mapping--点光源--硬阴影
原说的光栅化,只考虑某一点shading point、相机的位置、光源的位置,但还没考虑到时候有物体遮住。
shadow mapping本质上是一种图片空间的算法,在计算阴影的时候是不需要知道场景中的geometry的,但是必须解决走样问题。
算法关键:如果一个点不在阴影里,可以从相机或者光源处看到这个点。以光源为相机,做一张shadowmap。
记录从光源处看到的物体的深度。再从相机处观察物体,发出反向摄像到光源,看当前的深度信息与第一次记录到的物体的深度信息是否相同,相同则无遮挡无阴影。
但是是否深度相等的判断有误差,浮点数精度,像素大小影响。
硬阴影:点光源,全黑的部分。
软阴影:光源有一定大小时,软阴影的位置只能看到太阳的下半部分,不能看到上半部分。