仿射变换包括线性变换和平移变换,先来说线性变换中的旋转变换,这个稍微要复杂一点.
讲这个之前,我假设你已经对线性代数有一定的了解,比如三角函数,向量,以及矩阵的相关知识(以及他们所代表的几何意义),如果以上知识不熟悉,很难看懂下面讲的内容.
仿射变换包括旋转,缩放,平移,切变,反射...等等,在3D空间中,,所有这些效果都是通过矩阵来完成,也就是矩阵乘法实现,矩阵的乘法是满足结合律的,也就是说,我们可以通过先处理平移矩阵,再处理旋转矩阵,来达到平移并旋转物体到最终的位置,也可以先将平移和旋转两个矩阵组合成一个最终的矩阵,一次性应用到物体上,从而达到效果.
当然旋转可以是x轴,y轴,z轴中的任意维度的组合,基于以上推论,我们只需推导出任意一个轴的旋转即可,然后将三个维度的旋转组合成最终的矩阵应用到物体上.
那么我们就拿Z轴来说吧,如果绕Z轴旋转,相当于Z轴的坐标不变,我们将空间中的任何一点N投影到XY所在的平面,不考虑Z轴,假设投影点为P(x,y),当绕着Z轴旋转时(想象一下这个场景,有助于理解下面的证明),投影点旋转一定的角度到达P1(x1,y1)点,如下图:
根据矩阵的乘法运算规则,即可以得到绕Z轴旋转的矩阵M,同理如果我们绕X轴,或者Y轴也可以很简单的证明出来.
下面给出更为直观的理解:
我们知道3D空间中的任何点或者向量都可以表示成基向量的组合(分别是X,Y,Z方向的单位向量),在物体空间中,我们将坐标轴的范围定义为[-1,1],在未进行任何线性变换之前,三个基向量的分别为X(1,0,0), Y(0,1,0),Z(0,0,1),见下图,如果是绕X轴旋转,即ZY平面的旋转,如下:
同理:绕Y轴旋转为:
绕Z轴旋转为:
以上图片来自 Angles to Axes
这是从两种角度来看旋转矩阵,殊途同归,但是下面一种,直观,简洁,非常适合理解,不需要证明.
根据矩阵乘法的规则,缩放前的坐标和缩放后的坐标分别为:
即x' = ax, y' = ay, z' = az
则缩放矩阵为:
平移矩阵为:
为什么到平移变换就变成了四维矩阵(4x4),根据最终运算的结果
x' = x+t
y' = y+t
z' = z+t
如果不增加一个维度,无法使用统一的矩阵乘法来表示平移变换(投影矩阵也是通过增加一个维度,来统一了变换),只需要简单的增加一个维度,就完美的将所有的变换操作进行了统一,即通过乘法运算,将线性变换和平移变换统一起来(仿射变换),方便计算.
使用仿射变换,通过Model Matrix 就可以将物体从模型空间坐标系转换到世界空间坐标系
通过View Matrix 就可以将物体从世界控件坐标系转换到视图(摄像机)空间坐标系
通过Projection Matrix,就可以将物体从视图(摄像机)空间坐标系转换到屏幕上
下一篇:投影矩阵