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

pra*_*een 5 opengl-es coordinate-systems

假设我在OpenGL ES 2.0程序中为我的modelViewTransformation矩阵使用Identity Matrix.在这种情况下,坐标系统是规范的OpenGL坐标系统,它从(-1,-1,-1)延伸到(1,1,1).

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

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

Bob*_*oss 7

我的问题是,这个坐标系是右手还是左手?

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

...... API遵循的所有数学约定?

目前尚不清楚你的要求是什么.数学是基本的线性代数,强调矩阵数学和线性变换.

编辑回复评论问题:

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

glUniformMatrix4fv(uniforms[UNIFORM_MVP], 16, GL_FALSE, mvpMatrixZRotation);
Run Code Online (Sandbox Code Playgroud)

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

改变一切GL_TRUE,一切都会好起来的.

以下是OpenGL讨论板中与此特定主题相关的一个非常简单的示例.

另一个响应评论请求的编辑:这是 OpenGL中矩阵管道的另一个详细解释.请注意GL_MODELVIEW带有三个轴的图表:它们说明了右手坐标系.常见问题解答中的上述引用仍然适用.


rsw*_*kle 7

规范视图体积(又名标准化设备坐标)是左手坐标。通过传递单位矩阵并绘制 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 };
Run Code Online (Sandbox Code Playgroud)

并查看结果(使用 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;
}
Run Code Online (Sandbox Code Playgroud)

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

layout (location = 0) in vec4 v_vertex;

void main(void) 
{
    //no transformation, no confusion, just straight to OpenGL
    gl_Position = v_vertex;
}
Run Code Online (Sandbox Code Playgroud)

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

另请参阅这篇文章和我的评论/问题: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

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

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

您可以在自述文件中查看屏幕截图 https://github.com/rswinkle/opengl_reference

最终编辑:2020 年 9 月,我发布了 PortableGL。如果有人想了解 OpenGL 管道的内部结构/数学,并且作为一些证据,我知道我在这里谈论的是什么: http: //portablegl.com/


ZK_*_*ZK_ 5

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

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

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

忘了相机!

因为我们的屏幕是2D平面.想象一下,你的视口是一个黄色的橡胶平面.这四个角落到NDC.这样的事情: 在此输入图像描述

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