矩阵-DirectX与OpenGL的不同
http://www.cnblogs.com/graphics/archive/2012/08/02/2616017.html
矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库DirectX和OpenGL对矩阵操作却有着细微的差别,大多数的图形学书籍都以OpenGL为基础进行阐述,游戏编程类的书籍则更多使用DirectX,这就难免产生混淆,今天这篇主要讲讲两者在操作矩阵的时候有何不同。
矩阵
在三维图形学中,一般使用四维矩阵,也就是四行四列的方阵,下面是一个典型的四维矩阵

既然是三维图形学,为什么使用四维矩阵呢?主要有两个原因,第一,为了平移变换,第二,为了区别点和向量。
行向量与列向量
对于一个四维向量,它是行向量还是列向量呢?DirectX使用行向量,如下。

而OpenGL则使用列向量,如下

或者写成

矩阵与向量相乘
顶点进行几何变换的过程,从数学层面讲,就是顶点和矩阵相乘产生新顶点的过程,那么向量与矩阵相乘时顺序是怎样的呢?这取决于该向量是行向量还是列向量,我们知道两个矩阵Aij和Bxy若能相乘,则必须满足j=x才行,也就是说左边矩阵的列数要等于右边矩阵的行数,由于行向量和列向量本质上也是矩阵,也满足矩阵乘法的规律。
在DirectX中,使用行向量,所以向量和矩阵相乘的时候,向量在左,矩阵在右,如下。

而OpenGL中则使用列向量,相乘的时候矩阵在左,向量在右,如下。

比如对于平移变换来说,如果使用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中的运用问题:左乘/右乘,行优先/列优先,...
转自:http://www.cnblogs.com/soroman/archive/2008/03/21/1115571.html 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用1. ...
- DirectX标准规定 DirectX和OpenGL的不同
DirectX标准规定 DirectX使用左手坐标系. X轴正向指向右,Y轴正向指向上,Z轴正向垂直纸面向内. 编写Direct3D应用程序时,通常只使用4×4的矩阵和1×4的行向量,相乘时行向量在前 ...
- C#使用原生的Directx和OpenGL绘图
原文 混合语言编程-C#使用原生的Directx和OpenGL绘图的方法 由于项目需要做一些图形展示,所以就想到了使用Directx和OpenGL来绘图,但项目准备使用C#来开发(大家比较熟悉C#), ...
- (转)Windows 支持 DirectX 和 OpenGL,为什么大多数 PC 游戏还是 DirectX 开发?
事实上在早年OpenGL即使在游戏领域也是对DirectX压倒性的优势.John Carmack曾嘲讽DirectX是"horribly broken" 的API.直到Direct ...
- 如何检查显卡类型,DirectX和OpenGL的版本
How To: Check the graphics card type and OpenGL version From: http://support.esri.com/technical-arti ...
- 视图矩阵的推导-opengl应用
把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵. 下面我们先看下opengl视图矩阵的推导过程: 假设视点或camera的局部坐标系为UVN,UVN分别指向右方.上方和后方从而构成右手坐标系,视 ...
- 比较DirectX和OpenGL的区别(比较详细)
OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库.OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL.IRIS GL是一个工业标准的3D图形软件接口,功能虽然 ...
- OpenGL投影矩阵
概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...
- 关于OPenGL和OSG的矩阵 (转)
关于OPenGL和OSG的矩阵 矩阵真的是一个很神奇的数学工具, 虽然单纯从数学上看, 它并没有什么特别的意义, 但一旦用到空间中的坐标变换,它就“一遇风云便成龙”, 大显神威了.简单的工具实现了复杂 ...
随机推荐
- ubuntu文件定时加密压缩
#!/bin/sh #zip.sh DATE=`date -d yesterday +"%Y%m%d"` #password PASS="123456" if ...
- [geeksforgeeks] Count the number of occurrences in a sorted array
Count the number of occurrences in a sorted array Given a sorted array arr[] and a number x, write a ...
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:\WINDOWS\TEMP/wordpress-4.tmp'
朋友的wp博客好久没管理了,让ytkah帮忙打理一下,进到后台发现版本还是3.9的,那是比较早以前的版本了,早该升级了. 在升级wordpress时出现以下错误: 无法安装这个包: PCLZIP_ER ...
- CodeSite使用小结 转载
一.要使用Codesite,需要引用csintf单元二.CodeSite的基本方法(一)AddCheckPoint方法codesite.AddCheckPoint 加入监测点(二)AddSeperat ...
- Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)
第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...
- UITextField输入中文限制
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEve ...
- POJ 1989
#include <iostream> #define MAXN 10005 using namespace std; bool mark[MAXN]; int main() { //fr ...
- C++ 第一次上机作业
今天完成了C++第一次上机作业,感觉比较简单. 题目: 求2个数或3个正整数中的最大数,用带有默认参数的函数实现. 对3个变量按由小到大顺序排序,要求使用变量的引用. 编写一个程序,用同一个函数名对几 ...
- EditText 属性
android:layout_gravity="center_vertical" 设置控件显示的位置:默认top,这里居中显示,还有bottom android:hint=&quo ...
- C#实现文件增量备份
最近将客户的一个ASP网站部署到了公司的机房云服务器上,该ASP网站的文件总容量已有将近4GB. 虽然现在硬盘容量很大,但每天一次完整备份的话,那占用的硬盘空间会急剧上升,考虑一个更优的备份方案就是每 ...