OpenGL坐标系是左手还是右手?

我想了解OpenGL坐标系。 不过,有些教程说默认的坐标系是左撇子的(参见http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx ),而其他人则说这是右撇子(参见http:// www .falloutsoftware.com / tutorials / gl / gl0.htm )。 哪个是对的? 我明白,我们可以通过镜像转换到另一个,但我想知道默认的坐标。

坐标系是右手的。 第一篇文章似乎是错误的。

这里有一些混乱。

在这里输入图像描述

OpenGL在物体空间和世界空间中是右旋的

但在窗口空间(又名屏幕空间),我们突然左手

这是怎么发生的

我们从右手到左手的方式是在glOrthoglFrustum投影matrix中的负z比例input。 将z缩放-1(同时将x和y保留原样)具有改变坐标系的旋向性的效果。

对于glFrustum,

在这里输入图像描述在这里输入图像描述

远近应该是正的, > 。 说 = 1000和 = 1。 那么C = – (1001)/(999)= -1.002。

在这里看到更多的细节和图表。

正交的angular度来看 ,glOrtho像这样产生一个matrix:

在这里输入图像描述

在这里, 底部顶部只是左侧垂直右侧垂直底部水平顶部水平剪切平面(resp)的坐标 。

然而, 远的飞机是不同的near参数被定义为

  • 近处: 距离较近的深度剪切平面的距离 。 如果飞机要在观众的后面,这个距离是负的。

远:

  • zFar到更远的深度剪切平面的距离 。 如果飞机要在观众的后面,这个距离是负的。

这里我们有一个典型的典型视图体积

典范

因为z乘数是(-2 /(远近)), 所以减号有效地将z乘以-1 。 这意味着在观看转换过程中“z”是左手的,大多数人不知道,因为他们只是在OpenGL中作为“右手”坐标系工作。

所以,如果你打电话

 glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10, 

那么附近的飞机就在你前面10个单位 。 你在哪? 为什么在原点时,x轴在右边,y轴在你的头顶,而你的鼻子指向负的z轴 (这是默认的“默认情况下,相机位于原点,指向负的z轴,并具有(0,1,0)的向上向量。“ )。 所以近平面是在z = -10。 远飞机在你后面10个单位,在z = + 10

默认情况下,标准化设备坐标是左手的。

glDepthRange默认为[0,1](near,far),使+ z轴指向屏幕,+ x向右,+ y向左是系统。

将深度范围更改为[1,0]将使系统右旋。

引用尼科尔先前的回答 :(这是我的工作,下面解释)

我很惊讶没有人提到:OpenGL也是在左手坐标系下工作的。 至less,当你使用着色器并使用默认的深度范围的时候,它会执行。

一旦你抛出固定function的pipe道,你直接处理“剪辑空间”。 OpenGL规范将剪辑空间定义为4D齐次坐标系统。 当你通过标准化的设备坐标转换到窗口空间时,你会发现这个。

窗口空间位于窗口像素的空间中。 原点在左下angular,+ Y向上,+ X向右。 这听起来很像一个右手坐标系统。 但是Z呢?

默认深度范围(glDepthRange)将近Z值设置为0,将远Z值设置为1 。 所以+ Z正在离开观众。

这是一个左手坐标系。 是的你可以 将深度testing从GL_LESS更改为GL_GREATER和 将glDepthRange从[0,1]更改为[1,0]。 但OpenGL的默认状态是在左手坐标系下工作。 所以,从剪辑空间到窗口空间所需的转换都不会影响到Z.因此,在剪辑空间中,顶点(或几何)着色器的输出是左手空间(也就是说,它是一个4D均匀空间,所以很难把握手)。

在固定functionstream水线中,标准投影matrix(由glOrtho,glFrustum等产生)全部从右手空间变换为左手空间。 他们翻转Z的意思; 只要检查他们产生的matrix。 在眼睛空间中,+ Z向观看者移动; 在后投影空间中,它移开。

我怀疑微软(和GLIDE)根本就没有在投影matrix中进行否定。

因为它与我的发现不一致,所以我做了一个部分。

要么改变DepthRange DepthFunc,要么使用ClearDepth(0),但是在使用它们时,它们彼此抵消,回到左手系统。

只有NDC

你应该只注意到OpenGL only knows NDC!! ,它是一个左手坐标。 无论使用什么坐标,左右轴坐标等,都需要镜像到NDC。 如果你喜欢,你可以完全写在左边的世界空间坐标。

为什么我们在世界空间中使用右手坐标?

我认为这是常规的,它只是做。也许只是想与DirectX区分开来。

松田孝一着的“WebGl程序devise指南”在“WebGl / OpenGl:Left or Right Handed?”上花费了近十页的篇幅。

根据这本书:

  • 实际上,大多数人使用右手系统

  • OpenGl实际上是一个内部的左撇子系统

  • 在内部,更深层次它实际上并不是。 在最底层的OpenGl不关心z值。 您绘制事物的顺序决定了顶部绘制的内容(先绘制一个三angular形,然后绘制一个四边形,四边形覆盖三angular形)。

我不完全同意“既不是这样”,但这可能是一个哲学问题。

Opengl绝对是左撇子。 你会看到很多教程,因为它们否定投影matrix中的z值,所以相反。 当顶点着色器内部计算出最终的顶点时,它将从客户端(右手坐标)传递到顶点的顶点转换为左手,然后将顶点传递给几何着色器和片段着色器。 如果你在客户端使用右手坐标系,Opengl不在乎。 它只知道标准化的坐标系,这是左手的。

编辑:如果你不信任我,只需在顶点着色器中添加一个翻译matrix,就可以很容易地看到Opengl是否是左手的。