1 线性代数中矩阵的标准定义

矩阵的标准定义:

矩阵A与B的乘积矩阵C的第i行第j列的元素c(ij)等于A的第i行于B的第j列的对应元素乘积的和。

无论是Direct3D或者OpenGL,所表示的矢量和矩阵都是依据线性代数中的标准定义的。

2 行主序矩阵列主序矩阵

矩阵的存储方式分为两种,一种是行主序/行优先矩阵,另一种是列主序/列优先矩阵。在Direct3D中采用行主序矩阵存储矩阵,将矩阵每一行存储到数组的每一行中。而在OpenGL中采用列主序矩阵存储,将矩阵的每一列存储到数组的每一行中。

说的有点复杂,将下面矩阵示例:
1. 标准的线性代数矩阵

\begin{bmatrix}a_{11}&a_{12}&a_{13}&a_{14}\\a_{21}&a_{22}&a_{23}&a_{24}\\a_{31}&a_{32}&a_{33}&a_{34}\\a_{41}&a_{42}&a_{43}&a_{44}\end{bmatrix}
  1. Direct3D行主序矩阵
\begin{bmatrix}a_{11}&a_{12}&a_{13}&a_{14}\\a_{21}&a_{22}&a_{23}&a_{24}\\a_{31}&a_{32}&a_{33}&a_{34}\\a_{41}&a_{42}&a_{43}&a_{44}\end{bmatrix}
  1. OpenGL列主序矩阵
\begin{bmatrix}a_{11}&a_{21}&a_{31}&a_{41}\\a_{12}&a_{22}&a_{32}&a_{42}\\a_{13}&a_{23}&a_{33}&a_{43}\\a_{14}&a_{24}&a_{34}&a_{44}\end{bmatrix}

3 由矩阵存储顺序引发的矩阵左乘/前乘或者右乘/后乘问题

从根本上来说,矩阵的定义是确定的,但是在不同的引擎的实现过程中对矩阵的存储方式选择了行主序矩阵或者右主序矩阵的存储方式,而由此引发了矩阵左乘或者是右乘的问题。
在线性代数中,矩阵乘法是“行*列”。
那么对于行主序矩阵,通常采用前乘。
对于列主序矩阵,通常采用后乘。

4 由矩阵存储顺序引发的变换顺序问题

而这种矩阵乘法的顺序通常影响了对目标物体的变换顺序。
在OpenGL中,因为其实际上是列主序矩阵,采用列向量,所以在OpenGL中,做旋转变换时通常先处理右边的矩阵,然后再处理左边的矩阵。
在Direct3D中,因为其实际上是行主序矩阵,采用行向量,所以在Direct3D中,做旋转变换时通常先处理左边的矩阵,然后在处理右边的矩阵。