OpenGL数学基础之矩阵
2016-07-25 00:13
369 查看
三维空间物体的运动使用变换来表示,包括三种:平移变换(translate),旋转变换(rolate),伸缩变换(scale),变换量可以使用4x4的矩阵(Matrix)表示,变换过程就是对物体的所有顶点都乘以这个矩阵。
矩阵惩罚是行列向量相乘,所以行跟列必须是一样的矩阵才能相乘。
单位矩阵:
$ \begin{bmatrix} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \ \end{bmatrix} $
根据上面的乘法公式可以知道,任何矩阵与单位矩阵相乘等于本身。
$ \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} $
$ \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
所以变换的组合可以将每个变换的分量相乘,最后再乘以这个顶点即可。
矩阵乘法
$ \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
所以变换的组合可以将每个变换的分量相乘,最后再乘以这个顶点即可。
相关文章推荐
- OpenGL数学基础之矩阵
- JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
- mysql 5.7 docker 主从复制架构搭建教程
- Linux 终于足够好,可以取代 Windows 了吗?
- linux命令-cheat
- Linux bash特性
- Linux用户管理及权限笔记(1)
- bash 交互与非交互
- Hadoop安装(Debian 8)
- 【转】nginx配置总结
- linux 查看文件内容
- 虚拟机安装linux
- linux 基本命令
- linux命令 export
- Tomcat 部署Let’s Encrypt免费SSL证书&&自动续期
- 网站集成支付宝即时到帐接口
- nginx内存池及内存管理库
- Nginx 开机启动
- CentOS编译安装Swoole
- linux tomcat自动启动