5.3 线性代数基础(Linear Algebra 101)
在OpenGL中向量和矩阵用的非常多,其中一个非常重要的应用就是设置正交投影和透视投影。使用矩阵进行投影你只需要做一些矩阵的加法与乘法,而且现代GPU是非常善于做这类工作。
现在让我们简单回忆下相关的一些基础,假如你不记得了、记性不好或者压根没有学过相关课程,那也不用担心;这里将会学习一些矩阵基础计算,一旦你理解了这些知识,我们将学习如何使用矩阵实现正交投影。
5.3.1 向量(Vectors)
向量就是一个一维数组,在OpenGL中,一个顶点的位置就是一个含四元素的向量,颜色也是一个向量。我们使用的大部分向量都包含四个元素,比如下面的例子,它就是一个包含x y z w四个元素的位置向量。
其中的w分量将在会后面有详细说明。
5.3.2 矩阵(Matrices)
矩阵是一个二维数组,在OpenGL中,我们通常是使用矩阵对向量进行正交或者透视投影,也可以用于对一个物体进行旋转、平移及缩放,要实现这些操作,我们只需要把矩阵与相应向量进行相乘即可。
下面是一个矩阵的例子,在矩阵与向量相乘的情况下,元素下标将会很有意义。
5.3.3 矩阵向量相乘(Matrix-Vector Multiplication)
当矩阵与向量相乘的时候,我们把矩阵放在左边而向量放在右边,然后从矩阵的第一行开始,把第一行的第一个元素与向量的第一个元素进行相乘,第一行的第二个元素与向量的第二个元素进行相乘,这样一直到第一行的最后一个元素与向量的最后一个元素进行相乘,然后把上面针对第一行相乘的所有结果加起来得到一个和,这个和就是结果向量的第一个元素。
下面是一个完整的矩阵向量相乘的例子:
正如上面所描述,第一行与向量相乘得到结果向量的第一个元素,第二行与向量相乘得到结果向量的第二个元素,这样一直进行到最后一行得到最后一个结果向量元素。
通过这个例子,可以看出元素下标在进行相乘时的直观意义,第一行的四个元素将会影响结果向量值x,第二行的四个元素将会影响结果向量值y,依次类推。在每一行内,第一个元素与向量的x相乘,第二个元素与y相乘,依次类推。
5.3.4 单位矩阵(The Identity Matrix)
现在我们来看一个实际的例子,我们将从单位矩阵开始,一个单位矩阵就像下面图示一样:
为什么这个矩阵叫做单位矩阵呢?这是因为当我们使用这个矩阵与任何向量相乘的时候结果都还是原向量,就像我们使用任何数与1相乘一样。
下面是一个使用单位矩阵与包含元素1、2、3、4的向量进行相乘的一个例子:
对于第一行,把向量的第一个元素与1相乘,向量的其它元素与0相乘;对于第二行,把向量的第二个元素与1相乘,其它元素与0相乘,依次类推;最终得到的结果向量与原向量相同。
现在化简上面的乘法并把结果相加,将会得到如下结果向量:
![\begin{bmatrix} 1\\ 2\\ 3\\ 4 \end{bmatrix}](https://private.codecogs.com/gif.latex?%5Cfn_cm%20%5Cbegin%7Bbmatrix%7D%201%5C%5C%202%5C%5C%203%5C%5C%204%20%5Cend%7Bbmatrix%7D)
5.3.5 使用矩阵进行平移(Translations Using a Matrix)
现在我们已经理解了单位矩阵,现在来看看在OpenGL中使用得比较多的一个能进行平移的简单矩阵,使用这个矩阵我们可以让物体在指定的方向上平移一定的距离。这个矩阵看起来就像单独矩阵一样,不过在最后一列多了三个元素,如下图所示:
现在来看一个简单例子,比如位置(2, 2, 0, 1),我们想把这个向量在x轴上平移3个单位,在y轴上平移3个单位,因此分别设置相关变量为3,如下图所示:
化简后得到如下:
最后把结果相关,最终位置如下:
现在的位置是(5, 5, 0, 1),正如我们想象的一样。
得到这个结果也很好理解,因为这里的平移矩阵来源于单位矩阵,因此相乘后首先会得到原来的矩阵,又因为平移分量也w相乘,w又是1(如果我们不设置w分量,OpenGL则会默认设置为1),结果就是简单的相加。
w分量在这里的作用相当重要,在下一章中我们将会学习透视投影,在透视投影后一个坐标的w分量就可能不是1了,这个时候假如我们使用这个不是1的w分量进行平移或者其它操作,那我们将会遇到麻烦,操作的结果将不会如你想象。
现在我们学习的矩阵知识足够定义正交投影了,下一节我们将进行正交投影的定义。