何为变换
首先是两个参考视频:
在生活中,或者说在我们开发游戏的时候,会碰见很多很多的变换。在图形学中,主要有如下两种变换,模型变换(例如模型的缩放,IK)和视图变换(例如相机的移动旋转)。还有例如三维空间到二维空间(投影)也是非常重要的变换。
上面提到的移动,缩放,旋转这些变换,其实都是将一个输入的值,进过一些操作,变成一个新的输出值。例如输入一个点的位置0,最后输出其位置10,即发生了移动变换。由这一个特性也可得出,所谓的变换其实就是函数。
输入值x -> 变换( 函数f(x) ) -> 输出值x
而使用变换是为了让我们以运动的方式去思考,例如前面提到位置0变为10,我们要想成是从0慢慢移动到10,并不是一下子变为10。
在线性代数中,变换考虑的是一个向量的输入以及输出,向量的起点都为原点,例如将向量(2,4)缩放0.5倍,即得到向量(1,2)。对于一个整个空间(称之为线性空间或向量空间),我们可以看作空间内有无数个点,而原点到每一个点的连线即为一个向量。空间的变换即空间中每一个向量都移动到对应输出向量的位置,也可以看作是空间中的每个点移动到变换后的目标位置。
例如下图,便是一个简单的空间旋转变换,向量(0,1)旋转后变为(1,0)。
接下来我们来看一个比较复杂的变换,如下图,为复平面上 的变换:
看着很高级,那么它是怎么变换成这样的呢?首先我们要了解何为复平面,简单来说复平面是用来表示复数的,即a+bi,其中a和b为实数,i为虚数()。复平面中x轴的值代表着复数中实部a的值,y轴的值代表着虚部b的值,因此点(1,1)代表着1+i,点(7,-8)代表着7-8i。清楚这一点后,我们就可以通过一些特殊的点,来计算出其变化后的值了,例如:
变化前的点 | 对应的复数 | 进行 |
变化后的点 |
(1,0) | 1 | (0.5,0) | |
(1,1) | 1+i | (0,1) | |
(1,2) | 1+2i | (-1.5,2) |
上面其实也就解释了下图中两根黄线的变化前后的缘由。至于为什么要在复平面上,应该是因为如果单纯的只是向量的平方那是没有意义的,因为向量是一个2*1的矩阵,向量的平方即为2*1的矩阵乘以2*1的矩阵,根据矩阵的乘法定义,我们知道它们无法相乘。
线性变换
线性代数限制在一种特殊类型的变换上,即线性变换。如果一个变换拥有以下两个性质,我们就称它为线性的变化:
- 直线在变换后仍保持直线,不能有所弯曲。
- 原点保持固定
我们知道变换即为一个函数,我们假设这个函数为 ,那么站在数学的角度上,如果同一个空间中的任意两个向量
和
,以及数域中的一个数k(可以简单的理解为k为一个实数),满足以下条件的话,函数
即为线性变换:
例如 ,代表着一个放大两倍的变换,设
,
,那么
。可得到
,
,
,满足第一条定则。设k=3,那么
,
,满足第二条定则。因此该变换为线性变换。
推导
设两个基向量 ,
那么任意一个向量
都有
,当空间发生线性变换后,所有向量都会发生变换,包括我们的基向量。假设变换后
,
,那么变换后的
即等于
,能推导出这步也是因为线性变换的那两个性质。
我们把它写成矩阵的形式:
到这一步我们发现,我们输入的向量为 ,输出的向量为
,学习了矩阵的乘法后会发现,这个结果不就是矩阵