(转载)OpenGL: 你不知道的左右手坐标系

原文地址:http://blog.csdn.net/augusdi/article/details/20450691

左右手坐标系

众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系。

除了上面Z轴的方向不一样外,左右手坐标系的还有其他区别:

正向旋转方向:在左手系中用Left-Hand Rule判别,正方向是顺时针方向。在右手系中,用Right-Hand Rule判别,是逆时针方向。

叉积的方向:在右手坐标系中,叉积的方向通过Right-Hand Rule确定,而在左手坐标系中,叉积的方向则由Left-Hand Rule 确定。

World Space 坐标系

World Space 是定义物理世界位置的客观空间,Left hand 和 Right hand只是提供了两种不同的描述空间的方法,但描述的都是同一个世界。左右手坐

标系之间的转换并没有改变所描述的世界,真实世界中的时钟不管是在左手系还是右手系,都是按照顺时针方向旋转的。

View坐标系

无论是左手系还是右手系,World坐标系都描述了同一个世界空间,而你这么观察这个客观的世界空间,就取决于你所使用的坐标系了,这是OpenGL跟

Direct3D最主要的差别。下面先看个例子,

摄像机设置都是EyePos(0, 0, 15), LookAt(0, 0, 0), UpVec(0, 1, 0),红色方块的位置都是(-3, 0, 0),绿色方块的位置都是(3, 0, 0),

那么为什么OpenGL跟Direct3D是左右颠倒的呢?个人觉得是因为View坐标系是左手还是右手的关系,在Direct3D中,View空间坐标系是Left Hand,

Z轴就是ViewDirection(Lookat - EyePosition),当摄像机在(0,0,15)的地方往原点看的时候,确实是(-3,0,0)处红色的方块出现在(3,0,0)

出绿色方块的右边。而在OpenGL中,View空间坐标系是Right Hand, Z轴其实是-ViewDirection, 所以结果就是红色的方块出现在绿色方块的左边。

由此可见,左右手坐标系其实是左右颠倒的两个世界。

左右手坐标系的转换

上面也看到了,左右手坐标系渲染出来的2D图像结果是不一样的,左右颠倒,那如何使左右手坐标系渲染出相同的2D图像呢,有两种方法。

方法一:反转所有Vertex的X轴坐标和Camera的X坐标,左右手坐标系其实是左右颠倒的两个坐标系。

方法二:对用左右手坐标系渲染出来的2D图像进行水平方向上的反转。

在Modern OpenGL 中使用左手坐标系

众所周知,在固定管线的OpenGL中只能使用右手坐标系,OpenGL并没有提供API让你在左右手坐标系中切换。而在可编程管线的OpenGL中,就没有那么

多限制了,所有的Vertex Transform都由你来控制。事实上,你直接把左手坐标系的顶点和矩阵传给OpenGL Shader也是没有问题的,在Vertex Shader

使用mul(v, matrix)变换顶点,得到的会是跟Direct3D同样的结果。注意是跟Direct3D同样的结果,而不是跟固定管线OpenGL相同的结果,事实上,正如

上面所说,左右手坐标系渲染的结果的左右颠倒的。唯一要区别的是Viewport的Z,在OpenGL中,裁剪空间的Z坐标是[-1. 1],而在Direct3D中是[0, 1],

而经过Viewport变化后,不管是OpenGL还是Direct3D, Z都是[0, 1], OpenGL的视口变化是 Z=(Z/W + 1) / 2 ,而Direct3D是Z=(Z/W),这对Depth

Test不受影响,Depth Test只比较相对位置远近,但Depth Buffer的值就不同了。所以需要对project matrix做一些调整,才能让他们写到depth buffer中

的数值相同。具体来说,如果要让OpenGL流水线接受D3D的project matrix,就需要乘上

相当于把project space的顶点z都作了z = z * 2 – 1的操作,所以经过viewport变换就一致了。

Reference

【1】http://www.realtimerendering.com/blog/tag/coordinates/

【2】http://en.wikipedia.org/wiki/Cross_product

【3】http://paulbourke.NET/geometry/leftright/

【4】http://www.klayge.org/2011/07/15/%E8%B7%A8%E8%B6%8Aopengl%E5%92%8Cd3d%E7%9A%84%E9%B8%BF%E6%B

2%9F%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%BC%80%E7%AF%87/

时间: 2024-10-21 00:01:51

(转载)OpenGL: 你不知道的左右手坐标系的相关文章

OpenGL: 你不知道的左右手坐标系

左右手坐标系 众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系. 除了上面Z轴的方向不一样外,左右手坐标系的还有其他区别: 正向旋转方向:在左手系中用Left-Hand Rule判别,正方向是顺时针方向.在右手系中,用Right-Hand Rule判别,是逆时针方向. 叉积的方向:在右手坐标系中,叉积的方向通过Right-Hand Rule确定,而在左手坐标系中,叉积的方向则由Left-Hand Rule 确定. World Space 坐标系 World Spac

《左右手坐标系》

原文:http://www.cnblogs.com/hust-ruan/archive/2011/12/09/2282035.html 众所周知,OpenGL使用的是右手坐标系,而Direct3D使用的是左手坐标系. 除了上面Z轴的方向不一样外,左右手坐标系的还有其他区别: 正向旋转方向:在左手系中用Left-Hand Rule判别,正方向是顺时针方向.在右手系中,用Right-Hand Rule判别,是逆时针方向. 叉积的方向:在右手坐标系中,叉积的方向通过Right-Hand Rule确定,

[转载]OpenGL矩阵变换 一篇很好的译文

转自  http://blog.csdn.net/lyx2007825/article/details/8792475,太精华了收藏下  英文版本:http://www.songho.ca/opengl/gl_transform.html Overview 几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据. Object Coordinates

OpenGL中各种坐标系的理解[转]

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴.长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角 坐标为(1,1). 当前绘图坐标系:是绘制物体时的坐标系.程序刚初始化时,世界坐标系和当前绘图坐标系是重合 的.当用glTranslatef(),glScalef(),

<转载> OpenGL Projection Matrix

原文 OpenGL Projection Matrix Related Topics: OpenGL Transformation Overview Perspective Projection Orthographic Projection Updates: The MathML version is available here. Overview A computer monitor is a 2D surface. A 3D scene rendered by OpenGL must b

[转载]OpenGL ES着色器语言之内建函数(官方文档第八章)

OpenGL ES着色语言为标量和向量操作定义了一套内建便利函数.有些内建函数可以用在多个类型的着色器中,有些是针对固定硬件的,所以这部分只能用在某个特定的着色器上. 内建函数基本上可以分为一下三类: (1)它们使用一些简便的方式提供必要的硬件功能,如材质贴图.这些函数单独通过着色器是无法模拟出来的. (2)它们展示了一些可以常简单的写入的繁琐操作(clamp, mix等),但是这些操作非常普遍,并且提供直接对硬件的支持.对于编译器来说,将表达式映射到复杂的装配线指令上是非常困难的. (3)它们

Cocos2d-x 3.0坐标系详解(转载)

Cocos2d-x 3.0坐标系详解Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.笛卡尔坐标系笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系.屏幕坐标系和Cocos2d坐标系标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系.iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下.Cocos2d坐标系和Ope

[OpenGL]OpenGL坐标系及坐标转换

OpenGL通过相机模拟.可以实现计算机图形学中最基本的三维变换,即几何变换(模型变换-视图变换(两者合称几何变换)).投影变换.裁剪变换.视口变换等,同时,OpenGL还实现了矩阵堆栈等.理解掌握了有关坐标变换的内容,就算真正走进了精彩地三维世界. 坐标系统 世界坐标系:在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标.为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系.这个坐标系的长度单位

(转载)3D 图形编程的数学基础(1) 向量及其运算

原文地址:http://blog.csdn.net/vagrxie/article/details/4960473 版权声明:本作品由九天雁翎创作,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可.http://www.jtianling.com 目录(?)[+] write by 九天雁翎(JTianLing) -- blog.csdn.NET/vagrxie 讨论新闻组及文件 Technorati 标签: 向量,3D,坐标系,规范化,点积,叉积 说明 因为大学时在高等数学课程中学