矩阵-DirectX与OpenGL的不同

转载 2015年07月10日 17:53:18

了解游戏里面的矩阵变换

矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库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轴旋转

           

缩放变换

缩放变换矩阵,两者是一致的,因为缩放变换的变换因子都在矩阵的对角线上,所以转置矩阵等于其自身。

统一D3D与OpenGL坐标系统

DirectX 3D与OpenGL坐标系统的差异性,给我们带来很大的麻烦,让跨平台编程的新人很困惑。最近在做一个跨平台的游戏,仔细看了下两者的矩阵,发现并没有太大区别,将d3d左手系的矩阵传递给ope...
  • you_lan_hai
  • you_lan_hai
  • 2014年07月20日 16:23
  • 6965

OpenGL的矩阵运算是与DirectX相反的

这两天在用OpenGL做项目,但是在做矩阵操作的时候出了问题,按照数学上想当然的方法进行矩阵操作居然得不到想要的结果。后来一查,DirectX用的是行矩阵,OpenGL用的是列矩阵。应该是这个影响到矩...
  • hhhhhhhhhhkkkkkkkkkk
  • hhhhhhhhhhkkkkkkkkkk
  • 2015年04月14日 11:35
  • 545

Opengl与Directx的区别

OpenGL 只是图形函数库。 DirectX 包含图形, 声音, 输入, 网络等模块。  单就图形而论, DirectX 的图形库性能不如 OpenGL OpenGL稳定,可跨平台...
  • yihaiyiren
  • yihaiyiren
  • 2016年08月15日 13:39
  • 4659

opengl与Directx的区别

From: http://blog.163.com/xtdx888888@126/blog/static/2955727520083661133565/ OpenGL 只是图形函数库。 Direct...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2013年07月14日 13:39
  • 1842

矩阵-DirectX与OpenGL的不同

矩阵-DirectX与OpenGL的不同 矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库Di...
  • mysteryrat
  • mysteryrat
  • 2013年10月18日 10:23
  • 514

OpenGL、DirectX、3DMax之间的相似之处

OpenGL:只是一种图形函数库,2D、3D的图形API。但它作图非常方便,它提供图形的渲染功能,是一个跨平台的免费的API。                    在高端专业领域领先,处于统治地位。...
  • tony2278
  • tony2278
  • 2016年03月09日 09:26
  • 1168

OpenCL、OpenGL和DirectX三者的区别

什么是OpenCL?   OpenCL全称Open Computing Language,是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算...
  • fengye245
  • fengye245
  • 2016年06月10日 10:52
  • 15761

OpenCV,OpenGL,DirectX区别

GDI,图形设备接口,MS开发的通用的windows系统图形编程接口,功能强涉及面广,一般的编程都用它。但是用来做多媒体开发就差强人意了 OPENGL是SGI开发的一套三维图形软件包,出现很早,功能...
  • hlbwp
  • hlbwp
  • 2014年01月20日 11:33
  • 1535

OpenGL游戏引擎实现与OpenGL/DirectX 图形学

> OpenGL和DirectX  图形API可分为OpenGL和DirectX两大体系,各类DirectX和OpenGL的库函数.WINDOWS平台,个人推荐DX,其他平台推荐OPENGL。  Op...
  • ShareUs
  • ShareUs
  • 2017年08月16日 12:45
  • 715

SDL 和 OpenGL 关系

OpenGL是由SGI公司1992年7月发布,是一款基于桌面操作系统、功能强大、调用方便的底层3D图形库。 它是与硬件无关的软件接口, 可以在windows/Linux/Unix 之间移植。 针对嵌入...
  • sunny04
  • sunny04
  • 2014年01月09日 14:17
  • 3586
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:矩阵-DirectX与OpenGL的不同
举报原因:
原因补充:

(最多只允许输入30个字)