【GAMES101】11+12 Geometry2+3(curves and surfaces)

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
在这里插入图片描述
思路:通过定义一系列与时间有关的多项式,对不同的控制点进行插值,然后得到新的点,也就是曲线上的点。

贝塞尔曲线比较好的性质

  1. 贝塞尔曲线规定一定经过起点和终点,t =0再起点;t = 1 再终点;
  2. 如果4个控制点,那么起始和结束切线方向可以确定;
  3. 在仿射变换下,可以对不同顶点做仿射变换,对变化后的顶点画贝塞尔曲线 = 原始控制点画贝塞尔曲线,对曲线上每个点做仿射变换得到新贝塞尔曲线。
    (即若想对贝塞尔曲线做仿射变换那么只要对控制点做仿射变换、在画贝塞尔曲线就可以;但对投影不可以,如空间中画贝塞尔曲线,投影到相机平面上,对投影后的点画贝塞尔曲线,与原来的贝塞尔曲线不同);
  4. 凸包性质:画出来的贝塞尔曲线的任一点(任一时间t)一定在所有的控制点形成的凸包内。
    在这里插入图片描述

凸包:能够包围一系列给定的几何形体的最小凸多边形(或:平板定了很多钉子,橡皮筋拉的很大然后松手,橡皮筋会收缩在物体形成的某个外框上,这个框就是凸包)

凸包性质的应用:比如控制点都在一条线上,而贝塞尔曲线在形成的凸包内,也就是该线上,所以贝塞尔曲线就是这条线。
在这里插入图片描述

2.2 picewise(逐段)贝塞尔曲线

当控制点多的时候,贝塞尔曲线不太好控制:
在这里插入图片描述
产生逐段贝塞尔曲线,通常定义成每四个控制点、三次贝塞尔曲线定义成一段贝塞尔曲线,再连接起来。
在这里插入图片描述

如何保证连接点位置曲线是光滑的

三次贝塞尔曲线,起始切线和最后切线 b ′ ( 0 ) = 3 ( b 1 − b 0 ) b^{'}(0)=3(b_{1}-b_{0}) b(0)=3(b1b0) b ′ ( 1 ) = 3 ( b 3 − b 2 ) b^{'}(1)=3(b_{3}-b_{2}) b(1)=3(b3b2).所以如果连接点处的两个控制杆共线且等长,认为是光滑的(切线连续)。
在这里插入图片描述

连续性:
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形成曲面
在这里插入图片描述
通过该方式可以定义复杂曲面:
在这里插入图片描述
在这里插入图片描述

一些问题

  1. 不同贝塞尔曲面如何严丝合缝拼在一起、不会露出缝等问题(这里不说)

由于需要两个不同方向的时间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存在的问题

如果有软阴影,一定是因为光源有一定的大小。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值