矩阵空间变换
向量与矩阵的乘法
所谓向量与矩阵的乘法就是一个向量从一个线性空间(坐标系),通过选取一个新的基底([a1, a2]构成的新坐标系),变换到这个新基底构成的另一个线性空间的过程。
需要特别指出的是,一个向量的线性变换在几何上表现为缩放和旋转两个动作,以及这两个动作的组合——拉伸、压缩等。这些动作的一个共性就是都要通过原点。
矩阵乘法
我们已经可以把一个向量变换到另一个空间中,我们现在想把一组向量都变换到另一个空间中,这就需要通过矩阵乘法来计算,当然也就是矩阵乘法的意义。
为什么乘法公式要使左边矩阵的列数等于右边矩阵的行数呢?
左边的矩阵被定义为一个向量组,其列数被认为向量的维度;右边的矩阵被定义为一个线性空间,相乘运算就是将这个向量组线性变换到新的线性空间中。也就是说,右边的矩阵的行数最少要满足是由基底向量构成的线性空间的维度,或方程组的秩。这样就保证了这个变换必然存在。
线性变换——特征值与特征向量
我们知道,矩阵乘法对应了一个变换,它可以把一个向量变成另一个方向或长度都不同的新向量。在这个变换的过程中,原向量主要发生旋转、伸缩等变化。但是线性变换的规则要求这个变换必须通过由基底向量构成的坐标系原点。简单来说,以平面直角坐标系为例,这种变换不过就是沿着通过原点的某条直线的缩放和旋转。
这种变换必然导致有这样一组向量存在,即被变换的线性空间内的某个向量或向量组只发生了伸缩变换,而没有产生旋转的效果,也就是说在线性变换下,在它们所在的直线上保持不变。那么这些向量就称为这个矩阵的特征向量,伸缩的比例就是特征值。
这里如果特征值变为负值,即特征向量旋转180°,也可看作方向不变,而伸缩比为负值。所以特征向量也叫线性不变量。特征向量的不变性使他们变成与其自身共线的向量。特征向量在线性变换后可能伸长或缩短,或反向伸长或反向缩短,甚至变成零向量(特征值为零时),但与它变换后的向量应在同一条直线上。
矩阵的特征向量和特征值:
这里A是原矩阵,v是特征向量,是特征值。
有了特征值和特征向量还可以还原出原矩阵:
A是原矩阵,Q是特征向量,∑是特征值构成的对角矩阵。
OpenGL和OSG中的变换矩阵
平移矩阵T
平移向量Vt=(Vx, Vy, Vz);即向X轴平移Vx,向Y轴平移Vy,向Z轴平移Vz
缩放矩阵S
在XYZ轴的缩放比例尺分别为Sx, Sy和Sz
旋转矩阵R
对于平面中的直角坐标系,原点不变,逆时针旋转θ角后,新旧坐标之间的关系如下图:
因此绕Z轴旋转,即在xy平面逆时针旋转θ,旋转矩阵Rz为
因此绕X轴旋转,即在yz平面逆时针旋转θ,旋转矩阵Rx为
因此绕Y轴旋转,即在zx平面逆时针旋转θ,旋转矩阵Ry为
OpenGL和OSG的空间变换
旋转、缩放和平移变化可通过矩阵相乘的方法合并为一个单一矩阵,OpenGL和OSG中一般先进行平移变换,在进行旋转变换,最后进行缩放变换。
顶点坐标V(x, y, z),矩阵变换结果为V'(x', y', z')
缩放变换:Vs=V*S
旋转变换:R=RZ*Ry*Rx, Vr=Vs*R=V*S*R
平移变换:Vt=Vr*T=V*S*R*T
变换结果V'=Vt
参考资料
https://my.oschina.net/u/3888421/blog/2240220
https://www.cnblogs.com/zhoug2020/p/7864898.html
OpenGL编程指南(第九版)