说我在OpenGL ES 2.0程序中使用了一个Identity Matrix for my modelViewTransformation Matrix。在这种情况下,坐标系统是规范的OpenGL坐标系统,它从(-1,-1,-1)延伸到(1,1,1)。
这个坐标系是右手还是左手?
一个更广泛的问题:是否有一个OpenGL文档可以列出API所遵循的所有数学约定?
答案 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)
幻觉openGL是右手,因为在固定管道中,固定功能是右手的,如glOrtho(...),glFrustrum(..),所有这些功能都已被弃用在可编程 - 管线时代。<强>
ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!
强>
OpenGL并不关心用于中间矩阵过程的坐标系统。如果需要,可以使用轴坐标系,只要将其镜像到NDC即可。
忘了相机!
因为我们的屏幕是2D平面。想象一下,你的视口是一个黄色的橡胶平面。这四个角落到NDC。这样的事情:
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)的标准体积。我已通过代码验证了这一点。