前言:
在阅读本篇笔记之前,可以先了解一个思维方式:引入一个概念是为了解决某个问题,因此每一个概念都会有自己独有的意义,当然也是有缺点也是有优点的。本篇博客也是对games101-2的一个小小的复习笔记,后续争取两到三天一更,感谢各位大佬提出意见。
1、变换
1.1、为什么要学习变换呢?
拿unity来说,我们在使用unity制作游戏或者其他应用的时候,变换是时刻发生的,比如旋转或者平移等等。其次关于变换有个很重要的作用在于,空间的转换实际上是各个变换转变过来的,举个很简单的例子,unity的渲染流程可以简单概括为模仿视角(摄像机处于perspective的模式),将3D的变成2D的投影在屏幕上,这就是投影变换。
2、线性变换(Linear Transform)
2.1 大概介绍
首先这里为什么要介绍线性变换以及计算方法呢?在unity中确实已经将各种变换进行了封装,有对应的旋转矩阵、平移矩阵等等,但是在unity的渲染管线中我们在顶点着色器等等地方是可控的,同样,当我们明白了原理以后,调用unity自带的api也会变得更加得心应手,因此这里将会着重介绍一下线性变换的过程和具体实现。
对以下内容做个简单的提示:对任何普遍的点来说,特殊的点也会满足这个规律,用这个提示对一下内容可以自己进行推导
2.2、缩放变换
缩放变换是对物体进行比例的缩放:
可以通过矩阵的乘法来实现。(这里可以尝试一下手动推导)。
2.2、反射(对称)变换
简单来说就是绕着对称,对应unity中的spriteRender的组件来说就是flaction。
2.3、切变
这里实际就是y轴不变,或者x轴不变,然后进行比例变换。
2.4、旋转变换(默认逆时针绕原点)
推导一般可以看特殊点(左上和右下),这里可以展示一下课上老师体现的推导过程
这里可以看到用的是左上和右下,老师这里用的是(1,0)和(0,1),可以大胆推测一下,为什么unity重心点的边界是(0,1)呢?可能是为了方便做矩阵变换?可以一起讨论一下。
3、齐次坐标
3.1、为什么引入齐次坐标
首先我们得提到一个特殊的变换,平移变换。
我们通过上面描述的理论去对平移变换进行推导,发现并不能表现成向量*矩阵的形式,但是上述的线性变换是向量乘以矩阵的形式,又不希望将平移变换单独出来。因此就引入了齐次坐标。
3.2、齐次坐标概念
首先展示一下齐次坐标的形式:
通过形式可以看出最后为1是点为0向量。那么为什么呢?
实际上就是满足向量具有平移不变性,而点是唯一的,同样可以满足点和向量的操作。
可以对比以上操作进行推导。
那么是否有疑问呢?
其实我相信大多数人应该查过齐次坐标的作用是用来做仿射变换的,但是,什么是仿射变换?
怎么实现仿射变换?
关于这几个疑问我结合老师上课的观点来进行一下解释。
3.3、什么是仿射变换?
可以理解为:线性变换+平移变换。也就是说齐次坐标既可以用来计算上述的线性变换,又可以用来计算上述的平移变换。
3.4、怎么实现仿射变换?
这里是关于仿射变换的变换矩阵来实现的。可以使用齐次坐标进行计算来进行推导。
4、额外的复杂的变换
4.1、逆变换
上述所有的变换都是基于矩阵来实现的,那么矩阵存在逆矩阵,当然,变换也会存在逆变换,实际上可以理解为撤销变换。
4.2复杂的变换
1、简单变换组合(因此也是可以分解的)
2、变换的顺序也是很重要的(矩阵的乘法不满足交换律但是满足结合律)
写成矩阵的形式(连续引用不同的变换)
注意顺序的重要不然可能会出现下图的情况:
概念是互通的。
5、总结
主要是为投影变换埋下铺垫,将变换解释成矩阵的行为,埋下抽象某些概念的伏笔。
希望各位大佬可以互相讨论。小白感谢