1. 显式几何表示方法
1.1 点云
足够密集,表示一个几何。
1.2 mesh 面
三角形/四边形面,涉及到三角形的连接关系。
如何用三角形面表示物体
(.obj文件) 空间中的顶点、法线、纹理坐标分开表示,再组织起来形成一个模型。
如下,表示一个立方体。
v 表示空间中的八个顶点;
vn 定义六个面的六个法线(29 30行一样,自动建模产生的冗余);
vt 定义12个纹理坐标(每个面的4个点,最多24个,中间可以共用);
f(face) 定义三角形的连接关系,也就是哪三个点是一个三角形。v/vt/vn(也就是第几个,比如v,从v1-v8)
2. 曲线 curves
应用:
动画,相机沿着一个曲线移动;
建模软件中物体沿着曲线移动;
定义字体。
2.1 贝塞尔曲线
贝塞尔曲线:用一系列控制点定义曲线。
如下,四个控制点,起始切线方向p0p1,结束切线方向p2p3;曲线一定经过起始点、但不一定经过所有控制点。
任意多点如何画出贝塞尔曲线
(1) 三个控制点生成曲线——>二次贝塞尔曲线(quadratic bezier)
假设曲线起始点是时间0,终点是时间1,曲线表示任意时间t对应点的位置。(de Casteljau算法)
如下,比如t是1/3,分别在b0b1和b1b2上找t,得到两个点,在新得到的线段上认为是0-1时间、找t,得到一个点,之后不能再找到别的线段了,那么这个点就是这条贝塞尔曲线再时间t再的位置。
这里t是参数,所以贝塞尔曲线是显式表示。
枚举所有t,就可以得到曲线。
(2) 四个控制点
假设t 0.5
贝塞尔曲线代数表示方法
伯恩斯坦多项式:相当于对1自己进行n阶展开,所以再统一阶上,再同一时间t,相加等于1;如下,对称,是因为(n;i)表示从n中取i个数,
C
n
i
C_{n}^{i}
Cni
思路:通过定义一系列与时间有关的多项式,对不同的控制点进行插值,然后得到新的点,也就是曲线上的点。
贝塞尔曲线比较好的性质
- 贝塞尔曲线规定一定经过起点和终点,t =0再起点;t = 1 再终点;
- 如果4个控制点,那么起始和结束切线方向可以确定;
- 在仿射变换下,可以对不同顶点做仿射变换,对变化后的顶点画贝塞尔曲线 = 原始控制点画贝塞尔曲线,对曲线上每个点做仿射变换得到新贝塞尔曲线。
(即若想对贝塞尔曲线做仿射变换,那么只要对控制点做仿射变换、在画贝塞尔曲线就可以;但对投影不可以,如空间中画贝塞尔曲线,投影到相机平面上,对投影后的点画贝塞尔曲线,与原来的贝塞尔曲线不同); - 凸包性质:画出来的贝塞尔曲线的任一点(任一时间t)一定在所有的控制点形成的凸包内。
凸包:能够包围一系列给定的几何形体的最小凸多边形(或:平板定了很多钉子,橡皮筋拉的很大然后松手,橡皮筋会收缩在物体形成的某个外框上,这个框就是凸包)
凸包性质的应用:比如控制点都在一条线上,而贝塞尔曲线在形成的凸包内,也就是该线上,所以贝塞尔曲线就是这条线。
2.2 picewise(逐段)贝塞尔曲线
当控制点多的时候,贝塞尔曲线不太好控制:
产生逐段贝塞尔曲线,通常定义成每四个控制点、三次贝塞尔曲线定义成一段贝塞尔曲线,再连接起来。
如何保证连接点位置曲线是光滑的
三次贝塞尔曲线,起始切线和最后切线
b
′
(
0
)
=
3
(
b
1
−
b
0
)
b^{'}(0)=3(b_{1}-b_{0})
b′(0)=3(b1−b0),
b
′
(
1
)
=
3
(
b
3
−
b
2
)
b^{'}(1)=3(b_{3}-b_{2})
b′(1)=3(b3−b2).所以如果连接点处的两个控制杆共线且等长,认为是光滑的(切线连续)。
连续性:
C
0
C^{0}
C0连续(几何上的连续):若第一段终止点=第二段起点:;
C
1
C^{1}
C1连续(切线的连续)(也是一阶导数的连续):
C 2 C^{2} C2连续(曲率的连续)(也是二阶导数的连续)。
2.3 spline(样条)
样条:一个可控的曲线。
B-splines(很复杂)
指基函数样条:伯恩斯坦多项式在时间t几个不同的项对不同控制点做加权平均,也可以控制点位置对伯恩斯坦多项式做加权求和。 也就是伯恩斯坦多项式是基函数,通过不同方式组合可以形成别的函数。
比如贝塞尔曲线,有十个控制点,动其中一个点,整个曲线都会变化(不好),期待局部性,但希望不需要分段——>B样条具有局部性
非均匀有理B样条 NURBS
![在这里插入图片描述](https://img-blog.csdnimg.cn/4b051d809fe54acf98b1fffcda743093.png =400X)
3. 曲面
曲线概念延申到曲面。——>贝塞尔曲面
3.1 贝塞尔曲面
贝塞尔曲线如何得到贝塞尔曲面
如图,假设平面,有4*4个控制点用某种力向上拉得到。
(1)认为水平上有4*4的点,
(2)四行上的四个控制点分别做贝塞尔曲线,
(3)得到的四条贝塞尔曲线上又有四个控制点,形成新的贝塞尔曲线,
(4)新的贝塞尔曲线在不同时间t形成曲面
通过该方式可以定义复杂曲面:
一些问题
- 不同贝塞尔曲面如何严丝合缝拼在一起、不会露出缝等问题(这里不说)
由于需要两个不同方向的时间t,需要二维控制,这里u v
给u,得到4个蓝色点,给v,得到黑色点,所以是显式表示,因为是参数映射。
作业:画一条贝塞尔曲线。
----------------------------分割线 第12节课----------------------------------
3.2 mesh网格
3.2.1 网格细分 mesh subdivision
比如在位移贴图中,需要很多三角形才能赶上纹理的变化。
1. loop细分
名字(命名算法的人family name是loop,不是循环细分!)
两步操作:
1.增加三角形:
2.调整三角形位置(顶点位置):对于loop细分,把三角形顶点区分新顶点和老顶点,分别改变他们的位置。
如何调整顶点位置
1.更新新顶点位置:
白点:新顶点,只要不是表示物体边界,一定被不同三角形共享(边界情况不考虑)。
起到了让新出现的白点平滑的作用(求加权平均)
认为AB贡献大一点,CD贡献少一点。
2.更新旧顶点位置:
为更新位置,肯定与周围相邻的老顶点有关系。一部分相信自己的位置、一部分相信周围相邻旧顶点的位置。
n 顶点的度:顶点连接边的数量(图中白点n = 6)
u 与度有关的一个数
如果点连了很多三角形,说明自己不是很重要,更多相信周围的点;如果连的三角形少,更多相信自己。
2. Catmull-Clark细分(general mesh)
loop细分限制:只能是三角形网格.
quad face:四边形面;
non-quad face:除了四边形面的其他面;
extraordinary vertex 奇异点:度不为4的点.
步骤:
1.取边上的中点和面上的点连起来;
2.调整位置。
也就是catmull clark细分,做了一次细分之后,增加了原本非四边形数量的奇异点,之后非四边形均变成四边形面,此后奇异点数量也不会再增加。
2.如何调整位置:
分成三类点:面中间的点、边中心的点、老的点(用新的面中的点、边中间的点、和自己)
(与图像模糊操作类似,通过平均让局部变平滑,从而让整个面变平滑)
3.2.2 网格简化 mesh simplification
仍要维持三角形的连接关系,比如不能牛角断掉。
几何的层次结构,比如近处用30000各三角形表示,远处用3000各表示,但中间如何进行平滑过渡?(类似mipmap,图像的层次结构,但几何的层次结构很难实现,目前有研究)
1. 边坍缩
一条边连着两个顶点,捏再一起,边就不存在了。
问题是:要坍缩哪些边,判断边的重要性——>二次误差度量
(类似机器学习L2距离)新的点和原本的面有关系,使新的点到原本面距离的平方和最小。
如何坍缩边
令一条边坍缩后得到的点,放在任意一个位置,对原本的面的影响最小。——>每一条边,假设坍缩它,新的点放在最佳的位置得到的二次误差度量,比较。
坍缩一条边之后影响其他边的二次度量误差。
步骤:
(1) 遍历所有的边,计算二次度量误差;
(2) 坍塌一条边,动态更新受影响的边的二次度量误差;
(3) 再取最小
——>优先队列/堆
希望找到全局上的最优解,但是现在是再每条边(局部)找最优,也就是不断对局部找最优试图找到全局最优(贪心算法),(正常情况认为局部最优和全局最优不会相距甚远。)
(上图奶牛,接近平面的地方,坍缩的边多,用的三角形少)
3.2.3 网格正则化mesh regularization
让三角形基本变成正三角形、大小形状都差不多、不会出现特别尖的三角形(同时不能丢失模型本身表示质量),否则会对渲染造成不变。
4. 阴影
着色,局部现象,只考虑点自己、光源、相机,但实际不对,如果有其他物体遮挡再shading point和光源中间,应该是黑的(阴影)。——>shadow mapping(用光栅画阴影)
shadow mapping
shadow mapping:图像空间做法,再生成阴影这一步,不需要知道场景的几何信息;会产生走样现象。
思想:如果点不在阴影里,又能看到这个点,说明可以从相机看到这个点且光源也能看到这个点。
(经典shadow mapping只能处理点光源),这种阴影通常有非常明显的边界(硬阴影)(要么被看到要么没被看到,非0即1)
(相对应,后面也会说软阴影)
点光源如何生成阴影
1.从光源看向场景,记录看到的点的深度;(认为光源有个虚拟相机,成像平面)
2.从眼睛(/相机)出发,看向场景, 如图,看到两个黑色点,将其投影回光源看到的虚拟相机成像平面上(也就是从光源看向这个点,应该出现再图像的哪个位置上),计算这个黑点的深度(到光源的距离),查找步骤1中的深度图,如果两个深度一致,证明这个点是可以被看到的。
两者深度不一致,说明这个点看不到,该点再阴影中。
实例
1.从光源看过去,左图,并记录深度
2.真正相机看到的,每个实际位置投影回光源的虚拟相机
存在的问题:
(1) 一个像素可能覆盖很多点,且距离是用浮点数表示,判断相等很难,精度问题。
(2) 另外,从光源看向场景,把深度记在shadow map里,shadow map本身有分辨率,如果它的分辨率很低,而渲染的场景分辨率高,会导致走样,会投影出有锯齿的阴影。但用分辨率高的shadow map会有很大的开销。
比如游戏中,阴影质量,指的是shadow map分辨率。
shadow map存在的问题
如果有软阴影,一定是因为光源有一定的大小。