一、线性变换与仿射变换的概念
我们知道在计算机图形学中,变换通常包含线性变换、仿射变换、透视变换等。并且,我们用4x4的矩阵表述变换,同时引入了齐次坐标。那么,为什么会这样呢?
在讨论这个问题之前,我们需要了解一下线性变换和仿射变换的定义。
线性映射:在两个向量空间之间的一种保持向量加法和标量乘法的特殊映射。
线性变换种类较多,通常有旋转、缩放、错切、镜像等。
仿射映射:指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
二、用方程组表述线性变换与仿射变换
首先,我们讨论一下线性变换。由于线性变换种类较多,这里仅讨论最常见的旋转变换。
在三维笛卡尔坐标系中,我们如何得到点绕Z轴逆时针旋转α度后新的坐标?
由于是绕Z轴旋转,我们可以轻易地把笛卡尔坐标系转换为平面上的极坐标系,为半径坐标。假设点与X轴夹角为,我们可以得到关于,的方程(此处不用考虑)。
和
由方程组(1)和方程组(2)可以得出:
接下来我们讨论一下仿射变换中的特例:平移。
思考一个问题:在三维笛卡尔坐标系中,我们如何平移一个点?很简单,我们只需要将每一个坐标分量和对应的偏移量相加即可。
三、用矩阵表述线性变换和仿射变换
如果我们仅仅做单次的旋转或者平移,上面的方程组已经足够了。然而,在实际的项目当中,我们通常需要做复杂的连续的变换操作。如果还用这种方程组的办法,大量的计算不论是对开发人员还是计算机都是一种不必要的负担。因此,寻找一种更加方便计算的方法是无比迫切的事情。联系到矩阵与方程组的关系,以及矩阵乘法的本质,矩阵表述变换由此变得自然。
因此,旋转变换方程组可以由矩阵表述为:
由式(5)可以得出,旋转变换是一个3x3矩阵(设为)与点的乘积结果。即:
如果有多线性变换,其结果为:
同理,平移变换可以由矩阵表述为:
四、为什么是4x4矩阵?
很遗憾,平移无法用3x3矩阵与向量的乘法来计算。也就是说,3x3矩阵不能使投影变换的计算变得简单方便。
什么样的矩阵才能同时表述线性变换和平移?
回过头去重新审视方程组(3)、(4),上面的问题变成了什么样的矩阵能够同时表达方程组(3)、(4)。
考虑为了同时满足方程组(3)、(4),我们可以构造一个特殊的方程组:
这个方程组是一次旋转与一次平移的结合。然而,方程组中存在常量,我们如何用矩阵乘法来表述这个非齐次方程组呢?
我们可以把它看作一个四元齐次式,其中新增一个分量用来表示偏移量:
由方程组(9)、(10)可知:
现在,我们可以用4x4矩阵来表述方程组(11):
此时,我们已经可以用4x4矩阵同时表述旋转与平移。代价是我们新增了一个分量。
五、齐次坐标
上面提到的三位点额外添加一个分量组成的四元组,其实就是齐次坐标。那么,我们如何用齐次坐标表示三维的点呢?
事实上,齐次坐标 三维坐标 ,。
六、齐次坐标如何区分向量与点
由方程组(10)、(12)中,当,时,
这就是点的平移变换。
我们也知道,线性变换是发生在两个向量空间之间的,也就是说,一个向量经过线性变换会生成一个新的向量。而向量是没有位置的,所以向量没有平移变换。为了使得平移对向量无效,此时,。
由方程组(10)、(12)可知,当时,三维向量的旋转变换矩阵表述为
由方程式(13)、(14)可知,齐次坐标可以很好的区分向量和点。即,是点,是向量。