1、概述
上节提到,3D图形的移动,旋转,缩放等变换,都是通过乘以一个矩阵实现。那么为什么通过矩阵就可以实现呢?本节主要是探讨这个问题。要理解本节内容,你最好有点向量和矩阵的知识。
- 向量:有大小和方向的有向线段。物体的每一点,就是物体原点到每一点的向量,表示为:[1,0,0]等,也可以理解为点的坐标。
- 矩阵:可以理解为二维数组,OpenGL只考虑3x3或者4x4的矩阵。
更多向量和矩阵知识,请查阅:3D图形.pdf-对应向量和矩阵章节
2、向量变换
物体通过矩阵进行变换,其实就是物体里面的每个点(向量)通过矩阵进行变换。所以我们可以简单讨论向量通过矩阵的变换:
公式:新向量 = 矩阵 x 向量(v' = Mv)
上面是向量和矩阵的乘法。
行向量与矩阵相乘,行向量必须在矩阵左边,这叫行向量左乘,左乘才有意义。同理,列向量右乘才有意义。OpenGL使用列向量。后面的部分内容可能还是使用行向量,原理一样。
3、矩阵的几何意义
矩阵是怎么变换向量的呢,或者说我们怎么知道一个矩阵表示的意义呢,是使向量旋转了多少度,缩放了多少呢?
上图,我们分别用x轴的单位向量(基向量)[1 0 0],y轴的单位向量[0 1 0],z轴的单位向量[0 0 1],乘以矩阵,进行向量变换。
[1 0 0],x轴的单位向量,乘以矩阵后,得到了矩阵的第一行,所以矩阵的第一行就是x轴单位向量[1 0 0]经过矩阵转换后的向量。以后我们看到矩阵的第一行,就知道了x轴单位向量[1 0 0]变换后的向量。
同理,[0 1 0]y轴单位向量经过矩阵变换为第二行,[0 0 1]z轴单位向量经过矩阵变换为第三行。
知道上面的原理后,我们就可以进行下面的推导了:
矩阵为:
所以:
x轴基向量[1 0] --> [2 1]
y轴基向量[0 1] --> [-1 2]
所以我们就可以得到右图
反过来,如果我们想让左图转变为右图,根据右图的x轴和y轴,反推出矩阵。
再来看个三维的例子:
矩阵意义总结:
我们可以推理出:
1、绕x轴旋转的矩阵为:
2、绕y轴旋转的矩阵为:
3、绕z轴旋转的矩阵为:
缩放:
4、4x4矩阵
平移,你会发现,按上面的理论,根本无法表示平移?
上面的变换都是围绕坐标原点的,平移会使物体离开原点,一个3x3的矩阵是无法表示平移的。
要加入平移,我们得用4x4的矩阵,如下图:
蓝色部分:我们知道旋转、缩放等的线性变换只需要通过3x3的矩阵就可以。所以这里的蓝色部分矩阵就代表线性变换(线性变换包括旋转,缩放等,表示的变换原点位置是不变的)。
紫色:表示投影相关参数,暂不关注。
绿色:
看下面例子:
向量[Vx Vy Vz] 分别产生了 tx、ty、tz的平移量。比如原点[0 0 0]就变成了[tx ty tz]
下面我们通过几个例子加深理解向量的仿射变换(仿射变换包括线性变换,可以理解为增加了平移的线性变换):
1、平移:
2、放大:
3、旋转
4、组合
向量 v' = Mv
矩阵 M = TR T为平移矩阵,R为旋转矩阵
所以 v' = (TR)v