1 矩阵乘法
矩阵乘法满足结合律,所有括法都能计算出正确结果,有些组中标量乘法多,有些标量乘法少,寻找使标量乘法最少的括法的问题称作矩阵链问题。
2 行向量和列向量
行向量派认为:
- 行向量在文字中更好看。
- 矩阵转换读起来更习惯,例如用矩阵 A 、 B 、 C 转换向量 v ,行向量记作
vABC
,顺序,而列向量记作CBAv
,逆序。 - DirectX 使用行向量。
列向量派认为:
- 列向量在等式中更好看。
- 圣经多使用列向量。
- OpenGL 使用列向量。
3 矩阵变换
没人能告诉你矩阵像什么,你必须自己去感受。
一个坐标系能用任意三个不在同一平面上的基向量定义,因此一个向量能表示为任意三个不在同一平面上的基向量的线性组合。矩阵的每一行都能解释为转换后的基向量。这是矩阵变换的根基。
变换物体与变换坐标系是等价的。
由于矩阵乘法满足结合律,能用一个矩阵直接从模型坐标系变换到摄像坐标系,因此如果我们先在循环外将该矩阵计算出来,再在循环内作矩阵乘法,效率会提高不少。
3.1 基本变换
3.1.1 任意旋转
旋转轴必须先转换为单位向量。得到向量旋转前后的关系后,代入三个基向量,求出旋转矩阵。
3.1.2 任意缩放、投影、镜像
基向量构造的缩放矩阵是任意缩放的特例。
向某一平面投影,就是沿着该平面的法向量缩放,且缩放因子为 0 ,代入计算即可。
镜像缩放因子为 -1 。
3.1.3 任意切变
一个坐标改变了另外两个坐标。很少用到。
3.2 变换类型
- 线性变换无平移,仿射变换有平移。
- 只有投影不是可逆变换。
- 只有平移、旋转、均匀缩放是等角变换。镜像不是等角变换,因为夹角的方向变了?
- 只有平移、旋转、镜像是正交变换,变换过程中不缩放坐标轴。
- 只有平移、旋转是刚体变换,只改变物体的位置和方向,不改变形状。镜像不是刚体变换。
4 行列式
余子式是一个矩阵,而代数余子式是一个标量。
方阵的行列式是递推出来的,高阶行列式计算的复杂度呈指数递增。
行列式的一些重要性质:
- 矩阵的积的行列式等于各个矩阵的行列式的积。
- 转置矩阵的行列式等于原矩阵的行列式。
- 如果矩阵的任意行或列全为 0 ,那么它的行列式等于 0 。
- 交换矩阵的任意两行或两列,行列式变负。居然是任意?要不要证明一下?
- 任意行或列的非零积加到另一行或列上不会改变行列式的值。也要证明一下。
2D 中,行列式等于以经过该矩阵变换后的基向量为两边的平行四边形的有向面积。 3D 中,行列式等于以经过该矩阵变换后的基向量为三边的平行六面体的有向体积。行列式的绝对值和面积或体积的变化量相关,正负符号表示变换过程包含了镜像或投影。
5 逆
计算行列式的值是判断矩阵是否可逆的有效方法。
这里应该给出计算标准伴随矩阵的详细过程。对于低阶矩阵,标准伴随矩阵更快。
矩阵的逆的重要性质只有一条:矩阵乘积的逆等于矩阵的逆的逆序的乘积。
6 正交矩阵
正交矩阵与它的转置矩阵的乘积等于单位矩阵,或者说正交矩阵的逆等于它的转置矩阵。如果提前得知矩阵是正交矩阵,就能避免计算逆矩阵。旋转矩阵和镜像矩阵都是正交矩阵。
那么如何才能提前得知矩阵是正交矩阵呢?
- 每一行向量都是单位向量。
- 所有行向量互相垂直。
- 每一列向量都是单位向量。
- 所有列向量相互垂直。
对于一些近似正交的矩阵,可以将每一行减去它平行于已处理过的行的那一部分,使之成为垂直向量,并缩放程单位向量。明显注意到第一行总是不变的,只有通过迭代才能减少因为运算顺序带来的误差。
7 齐次矩阵
为了平移。
7.1 齐次空间
注意切变公式与带平移的齐次矩阵之间的关系。在 4D 中切变可以实现在 3D 中平移。
同时解决了零向量的问题。
7.2 透视投影
把向量除以 w ,反推奇异的齐次向量。