OpenGL数学基础之矩阵

三维空间物体的运动使用变换来表示,包括三种:平移变换(translate),旋转变换(rolate),伸缩变换(scale),变换量可以使用4x4的矩阵(Matrix)表示,变换过程就是对物体的所有顶点都乘以这个矩阵。

矩阵乘法

$ \begin{bmatrix} 1 & a & b \ c & 1 & d \ e & f & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \end{bmatrix} $ = $ \begin{bmatrix} x + a * y + b * z \ c * x + b + d * z \ e * x + f * y + z \end{bmatrix} $

矩阵惩罚是行列向量相乘,所以行跟列必须是一样的矩阵才能相乘。

单位矩阵:
$ \begin{bmatrix} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \ \end{bmatrix} $
根据上面的乘法公式可以知道,任何矩阵与单位矩阵相乘等于本身。

平移变换

假如有点(x, y, z),现在将其安向量$(v_1, v_2 ,v_3)$平移,结果就为$(x + v_1, y + v_2, z + v_3)$,用矩阵表示如下:

$ \begin{bmatrix} 1 & 0 & 0 & v_1 \ 0 & 1 & 0 & v_2 \ 0 & 0 & 1 & v_3 \ 0 & 0 & 0 & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} $ = $ \begin{bmatrix} x + v_1 \ y + v_2 \ z + v_3 \ 1 \end{bmatrix} $

多出一行的原因是,但xyz都为0的时,矩阵乘法的结果总是为0,无法表示远点的平移;同时,4x4的矩阵可以连乘。

旋转变换

如图,圆为单位圆,已知点$(x_1, y_1)$,绕z轴旋转角度b,求该点旋转之后的坐标$(x_2, y_2)$,由图可得:
$x_2 = cos(a+b) = cos(a)cos(b) - sin(a)sin(b) = x_1cos(b) - y1sin(b)$
$y_2 = sin(a+b) = sin(a)cos(b) + sin(b)cos(b) = y_1cos(b) + x_1sin(b)$
所以用矩阵表示点(x, y, z)绕z轴旋转(xy平面内)角度b:
$ \begin{bmatrix} cos(b) & -sin(b) & 0 & 0 \ sin(b) & cos(b) & 0 & 0 \ 0 & 0 & 1 & 0 \ 0 & 0 & 0 & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} $ = $ \begin{bmatrix} xcos(b) - ysin(b) \ xsin(b) + ycos(b) \ z \ 1 \end{bmatrix} $
绕y轴旋转(xz平面内)角度b:
$ \begin{bmatrix} cos(b)& 0 & -sin(b)& 0 \ 0 & 1 & 0 & 0 \ sin(b) & 0 & cos(b) & 0 \ 0 & 0 & 0 & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} $ = $ \begin{bmatrix} xcos(b) - zsin(b) \ y \ xsin(b) + zcos(b) \ 1 \end{bmatrix} $
绕x轴旋转(yz平面内)角度b:
$ \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & cos(b) & -sin(b) & 0 \ 0 & sin(b) & cos(b) & 0 \ 0 & 0 & 0 & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} $ = $ \begin{bmatrix} x \ ycos(b) - zsin(b) \ ysin(b) + zcos(b) \ 1 \end{bmatrix} $

伸缩变化

任何一个矩阵乘以单位矩阵得到的值不变,如果我们将单位矩阵中的分别比分别变为 $(s_1, s_2, s_3)$,则可以得到:
$ \begin{bmatrix} s_1 & 0 & 0 & 0 \ 0 & s_2 & 0 & 0 \ 0 & 0 & s_3 & 0 \ 0 & 0 & 0 & 1 \ \end{bmatrix} $ * $ \begin{bmatrix} x \ y \ z \ 1 \end{bmatrix} $ = $ \begin{bmatrix} xs_1 \ ys_2 \ zs_3 \ 1 \end{bmatrix} $
这个矩阵变换表示点$(s_1, s_2, s_3)$分别在xyz轴缩放$s_1, s_2, s_3$。

变换组合

因为矩阵的乘法满足结合律:
M1 * M2 * ... * Mn * V = (M1 * M2 * ... * Mn) * V
所以变换的组合可以将每个变换的分量相乘,最后再乘以这个顶点即可。

posted on 2016-07-25 00:13  寒灬风  阅读(396)  评论(0编辑  收藏  举报

导航