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

时间:2011-03-02 13:33:59

标签: opengl-es coordinate-systems

说我在OpenGL ES 2.0程序中使用了一个Identity Matrix for my modelViewTransformation Matrix。在这种情况下,坐标系统是规范的OpenGL坐标系统,它从(-1,-1,-1)延伸到(1,1,1)。

这个坐标系是右手还是左手?

一个更广泛的问题:是否有一个OpenGL文档可以列出API所遵循的所有数学约定?

4 个答案:

答案 0 :(得分:7)

  

我的问题是,这是坐标吗?   系统右撇子还是左撇子?

默认情况下,OpenGL总是右手。您可以通过自动正常创建来观察此情况。您可以通过每点指定左手正常创建来强制执行,但一般来说,右手规则始终适用。有关OpenGL的右手性质的更多讨论,请参阅9.150 in the OpenGL FAQ

  

......所有数学惯例   其次是API?

目前尚不清楚你的要求是什么。数学是基本的线性代数,强调matrix math and linear transformations

编辑回复评论问题:

REMEMBER 但是,如果您使用的是统一矩阵调用而不是旧的glRotates等,则必须指定是使用行主矩阵还是列主矩阵。在这种情况下(来自评论中提到的代码):

glUniformMatrix4fv(uniforms[UNIFORM_MVP], 16, GL_FALSE, mvpMatrixZRotation);

在此调用中,GL_FALSE告诉调用这是一个列主矩阵,因此,结果的旋转将是预期的转置。因此,旋转将被反转,看起来像左手坐标系。

将其更改为GL_TRUE,一切顺利。

以下是来自OpenGL讨论区的very simple example,与此特定主题相关。

另一个编辑,用于响应OpenGL中矩阵管道的评论请求Here is another detailed explanation。注意带有三个轴的GL_MODELVIEW图:它们说明了右手坐标系。常见问题解答中的上述引文仍然适用。

答案 1 :(得分:5)

  

<强> ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!

幻觉openGL是右手,因为在固定管道中,固定功能是右手的,如glOrtho(...),glFrustrum(..),所有这些功能都已被弃用在可编程 - 管线时代。

OpenGL并不关心用于中间矩阵过程的坐标系统。如果需要,可以使用轴坐标系,只要将其镜像到NDC即可。

  

忘了相机!

因为我们的屏幕是2D平面。想象一下,你的视口是一个黄色的橡胶平面。这四个角落到NDC。这样的事情: enter image description here

NDC中的所有顶点都沿着-z轴撞击在黄色橡胶平面上。这就是你在真实屏幕上看到的内容。

答案 2 :(得分:4)

规范视图体积也称为规范化设备坐标是左手的。这很容易通过传递单位矩阵和绘制2个三角形来测试

float points[] = { -1,  1,  -0.5,
                   -1, -1,  -0.5,
                    1, -1,  -0.5,

                    1,  1,   0.5,
                   -1, -1,   0.5,
                    1, -1,   0.5 };

并查看结果(使用glEnable(GL_DEPTH_TEST))

所以你的顶点着色器看起来像这样:

uniform mat4 mvp_mat;

// Incoming per vertex... position (fills in 1 for w if from vec3 buf)
layout (location = 0) in vec4 v_vertex;


void main(void) 
{ 
    // multiplying by identity doesn't transform the geometry
    gl_Position = mvp_mat * v_vertex;
}

或者你甚至可以更简单地测试它,因为单位矩阵什么都不做

layout (location = 0) in vec4 v_vertex;

void main(void) 
{
    //no transformation, no confusion, just straight to OpenGL
    gl_Position = v_vertex;
}

显然,您必须使三角形的颜色不同,以便您可以看到它们的重叠方式。

另见本文及其评论/问题: plus.google.com/114825651948330685771/posts/AmnfvYssvSe

我不知道所有不正确的信息来自互联网甚至教科书。如果您正在谈论用于确定正面的三角形缠绕(默认情况下CCW =右手),OpenGL默认是右手。 OpenGL不存在世界空间,物体空间和眼睛空间,只对图形程序员存在。 OpenGL只取点,剪切规范视图体积[-1,-1,-1] x [1,1,1]之外的任何内容,并将它们转换为屏幕空间/窗口坐标,默认为[0,w] x [ 0,h)x [0,1]。如果启用了深度测试,则默认行为是左手,向下看+ z。

有几种方法可以解释OpenGL的左撇子问题。大多数人在他们的矩阵中处理​​它(虽然他们没有意识到)。我想你也可以使用glDepthFunc并将其设置为GL_GREATER来改变它。

http://www.opengl.org/sdk/docs/man3/xhtml/glDepthFunc.xml

进一步证明它是左撇子就在这里 http://www.opengl.org/sdk/docs/man3/xhtml/glDepthRange.xml

&#34;在剪切和除以w之后,深度坐标的范围从-1到1,对应于近和远剪裁平面&#34;即正z进入屏幕=左手。您还可以使用DepthRange更改为右手行为。

编辑:为了回应鲍勃克罗斯坚持我错了,这里有一个单一的源文件程序,表明我是对的。 https://github.com/rswinkle/opengl_reference/blob/master/src/left_handed.c

您可以在README中看到屏幕截图 https://github.com/rswinkle/opengl_reference

答案 3 :(得分:1)

Opengl ES坐标系确实是右手系统,包括(-1,-1,-1)到(1,1,1)的标准体积。我已通过代码验证了这一点。