四、OpenGL 矩阵变换原理

1、概述

上节提到,3D图形的移动,旋转,缩放等变换,都是通过乘以一个矩阵实现。那么为什么通过矩阵就可以实现呢?本节主要是探讨这个问题。要理解本节内容,你最好有点向量和矩阵的知识。

  • 向量:有大小和方向的有向线段。物体的每一点,就是物体原点到每一点的向量,表示为:[1,0,0]等,也可以理解为点的坐标。
  • 矩阵:可以理解为二维数组,OpenGL只考虑3x3或者4x4的矩阵。

更多向量和矩阵知识,请查阅:3D图形.pdf-对应向量和矩阵章节

2、向量变换

物体通过矩阵进行变换,其实就是物体里面的每个点(向量)通过矩阵进行变换。所以我们可以简单讨论向量通过矩阵的变换:

公式:新向量 = 矩阵 x 向量(v' = Mv)

image

上面是向量和矩阵的乘法。

行向量与矩阵相乘,行向量必须在矩阵左边,这叫行向量左乘,左乘才有意义。同理,列向量右乘才有意义。OpenGL使用列向量。后面的部分内容可能还是使用行向量,原理一样。

3、矩阵的几何意义

矩阵是怎么变换向量的呢,或者说我们怎么知道一个矩阵表示的意义呢,是使向量旋转了多少度,缩放了多少呢?

image

上图,我们分别用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轴单位向量经过矩阵变换为第三行。

知道上面的原理后,我们就可以进行下面的推导了:

image

矩阵为:

image

所以:

x轴基向量[1 0] --> [2 1]

y轴基向量[0 1] --> [-1 2]

所以我们就可以得到右图

反过来,如果我们想让左图转变为右图,根据右图的x轴和y轴,反推出矩阵。

再来看个三维的例子:

image

矩阵意义总结:

image

我们可以推理出:

1、绕x轴旋转的矩阵为:

image

2、绕y轴旋转的矩阵为:

image

3、绕z轴旋转的矩阵为:

image

缩放:

image

4、4x4矩阵

平移,你会发现,按上面的理论,根本无法表示平移?

上面的变换都是围绕坐标原点的,平移会使物体离开原点,一个3x3的矩阵是无法表示平移的。

要加入平移,我们得用4x4的矩阵,如下图:

image

蓝色部分:我们知道旋转、缩放等的线性变换只需要通过3x3的矩阵就可以。所以这里的蓝色部分矩阵就代表线性变换(线性变换包括旋转,缩放等,表示的变换原点位置是不变的)。

紫色:表示投影相关参数,暂不关注。

绿色:

image

看下面例子:

image

向量[Vx Vy Vz] 分别产生了 tx、ty、tz的平移量。比如原点[0 0 0]就变成了[tx ty tz]

下面我们通过几个例子加深理解向量的仿射变换(仿射变换包括线性变换,可以理解为增加了平移的线性变换):

1、平移:

image

2、放大:

image

3、旋转

image

4、组合

image

向量 v' = Mv

矩阵 M = TR T为平移矩阵,R为旋转矩阵

所以 v' = (TR)v

你可能感兴趣的:(四、OpenGL 矩阵变换原理)