矩阵-DirectX与OpenGL的不同
来源:互联网 发布:表格中提取相同的数据 编辑:程序博客网 时间:2024/06/08 11:25
矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库DirectX和OpenGL对矩阵操作却有着细微的差别,大多数的图形学书籍都以OpenGL为基础进行阐述,游戏编程类的书籍则更多使用DirectX,这就难免产生混淆,今天这篇主要讲讲两者在操作矩阵的时候有何不同。
矩阵
在三维图形学中,一般使用四维矩阵,也就是四行四列的方阵,下面是一个典型的四维矩阵
既然是三维图形学,为什么使用四维矩阵呢?主要有两个原因,第一,为了平移变换,第二,为了区别点和向量。
行向量与列向量
对于一个四维向量,它是行向量还是列向量呢?DirectX使用行向量,如下。
而OpenGL则使用列向量,如下
或者写成
矩阵与向量相乘
顶点进行几何变换的过程,从数学层面讲,就是顶点和矩阵相乘产生新顶点的过程,那么向量与矩阵相乘时顺序是怎样的呢?这取决于该向量是行向量还是列向量,我们知道两个矩阵Aij和Bxy若能相乘,则必须满足j=x才行,也就是说左边矩阵的列数要等于右边矩阵的行数,由于行向量和列向量本质上也是矩阵,也满足矩阵乘法的规律。
在DirectX中,使用行向量,所以向量和矩阵相乘的时候,向量在左,矩阵在右,如下。
而OpenGL中则使用列向量,相乘的时候矩阵在左,向量在右,如下。注意矩阵乘法中,若用^表示转置,则(AB)^=B^A^,所以下面的矩阵与DirectX中的矩阵互为转置矩阵,感谢网友ello指点。
比如对于平移变换来说,如果使用DirectX,那么m41,m42,m43分别对应三个平移分量,对应下面的Tx,Ty和Tz。
如果使用OpenGL,那么m11,m21,m31分别对应三个平移分量。
可以看出,对于同一个变换,DirectX中的矩阵和OpenGL中的矩阵互为转置矩阵。
矩阵连乘
如果有多个变换作用于一个顶点,那么可以先将所有的变换矩阵相乘,得到一个变换矩阵,最后将这个变换矩阵应用到顶点即可,这就涉及到矩阵的连乘,这时候如何安排矩阵的先后顺序呢?假设现在有三个变换,分别是平移变换,对应矩阵T,旋转变换,对应矩阵R,缩放变换,对应矩阵S,顺序是先平移,再旋转,后缩放,那么这个矩阵乘法该如何去写呢?
在DirectX中,矩阵乘法的顺序是从左到右,变换生效的先后顺序也是从左到右
而在OpenGL中,矩阵连乘的顺序是从右到左
不管是哪种方式,都是先产生作用的矩阵离顶点近(上面的T),后产生作用的矩阵离顶点远(上面的S)。
一个误区,左手系与右手系
矩阵乘法的顺序与坐标系是左手系还是右手系有关系么?根本没啥关系!
常用变换矩阵
下面给出几种常用的变换在DirectX和OpenGL中对应的矩阵,下图中左面是DirectX中的矩阵,右面是OpenGL中的矩阵。
平移变换
绕X轴旋转
绕Y轴旋转
绕Z轴旋转
缩放变换
缩放变换矩阵,两者是一致的,因为缩放变换的变换因子都在矩阵的对角线上,所以转置矩阵等于其自身。
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- 矩阵-DirectX与OpenGL的不同
- OpenGL的矩阵运算是与DirectX相反的
- 关于DirectX和OpenGL的不同
- OpenGL与DirectX的区别
- DirectX与OpenGL的博弈
- DirectX与OpenGL的博弈
- opengl与Directx的区别
- Opengl与Directx的区别
- openGL与DirectX等的比较
- Linux下的tar压缩解压缩命令详解
- Spring Filter过滤器,Spring拦截未登录用户权限限制
- 第八届蓝桥杯JAVA B组省赛题解
- thinkphp5不安装composer使用验证码
- Android将webp格式图片转换为png格式方法
- 矩阵-DirectX与OpenGL的不同
- inux下安装jdk8步骤详述
- 二叉树的最小深度
- Shiro 教程
- 【神搜递归】统计问题
- Android常用布局组件----重新认识Android(3)
- 实现调用android URLConnection封装后快速下载,并且可以获取到实时下载速度(get和put方法未验证)。 在while 中加个参数控制 中断.
- Jmeter之BeanShell
- 第三十三讲项目三 输出这样的整数