注:
1. OpenGL 是以列为主的矩阵存储方式。即(一维线性数组)优先存储矩阵的列。
2. OpenGL实现的列向量, 当与矩阵相乘时, 是矩阵左乘向量。 (这是按下文描述的说法表述)
注意上下两种表述, 可能导致理解偏差。 其实他们说的是同一个意思。
上面OpenGL命令实际相当于将变形矩阵一个一个的压栈, 最后一个一个
pop栈来与向量相乘, 就形成了NMLv的乘积形式。 而下面纯粹的是语言
描述的变形方式。
矩阵与向量相乘
顶点进行几何变换的过程,从数学层面讲,就是顶点和矩阵相乘产生新顶点的过程,那么向量与矩阵相乘时顺序是怎样的呢?这取决于该向量是行向量还是列向量,我们知道两个矩阵Aij和Bxy若能相乘,则必须满足j=x才行,也就是说左边矩阵的列数要等于右边矩阵的行数,由于行向量和列向量本质上也是矩阵,也满足矩阵乘法的规律。
在DirectX中,使用行向量,所以向量和矩阵相乘的时候,向量在左,矩阵在右,如下。
而OpenGL中则使用列向量,相乘的时候矩阵在左,向量在右,如下。
矩阵连乘
如果有多个变换作用于一个顶点,那么可以先将所有的变换矩阵相乘,得到一个变换矩阵,最后将这个变换矩阵应用到顶点即可,这就涉及到矩阵的连乘,这时候如何安排矩阵的先后顺序呢?假设现在有三个变换,分别是平移变换,对应矩阵T,旋转变换,对应矩阵R,缩放变换,对应矩阵S,顺序是先平移,再旋转,后缩放,那么这个矩阵乘法该如何去写呢?
在DirectX中,矩阵乘法的顺序是从左到右,变换生效的先后顺序也是从左到右
而在OpenGL中,矩阵连乘的顺序是从右到左
不管是哪种方式,都是先产生作用的矩阵离顶点近(上面的T),后产生作用的矩阵离顶点远(上面的S)。