2011-03-02 212 views
4

假设我在OpenGL ES 2.0程序上为我的modelViewTransformation矩阵使用了标识矩阵。这种情况下的坐标系统是从(-1,-1,-1)延伸到(1,1,1)的规范OpenGL坐标系统。OpenGL坐标系是右手还是左手?

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

一个更广泛的问题:是否有与OpenGL的一份文件,其中可以列出所有的数学约定其次是API?

回答

7

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

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

...所有数学约定 后跟API?

目前还不清楚你问什么。数学是基本的线性代数,主要集中在matrix math and linear transformations

编辑回应发表评论的问题:

记住,但是,如果您使用的是统一的矩阵调用,而不是旧的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图:它们说明了右手坐标系。常见问题解答中的上述引用仍然适用。

+0

可以说OpenGL是右撇子。比方说,我在屏幕上绘制变换矩阵为Identity的x,y轴,然后围绕z轴旋转角度theta = 30 Degrees。所以如果系统是右手的,那么应该逆时针旋转。然而,旋转恰好是顺时针指示左手系统。所以这让我很困惑。 – praveen 2011-03-03 07:44:37

+0

@praveen,我认为你误解了操作的顺序。如果您发布实际代码,原因将变得更加清晰。在OpenGL FAQ中检查9.070:http://www.opengl.org/resources/faq/technical/transformations.htm – 2011-03-03 13:21:30

+0

@BobCross Hi Bob。我正在尝试在iOS上学习OpenGL ES。我相信规范的视图体积有一个左手坐标系统。我的程序代码可以在这里找到:[链接](http://pastie.org/1628587)。 [要尝试这个代码,只需用这个代码替换XCode生成的iOS OpenGL模板项目中的渲染函数]。假设角度为正,系统是右手的,则旋转应该以逆时针方向进行。与此相反,旋转发生在顺时针方向。 – praveen 2011-03-03 13:55:53

1

的OpenGL ES坐标系统确实是右撇子的系统包括(-1,-1,-1)到(1,1,1)的典型量。我通过代码验证了这一点。

3

规范视图体积(也称为标准化设备坐标)是左撇子。这是很容易测试通过将单位矩阵和绘图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只需要点,剪切规范视图volume [-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

+0

哇!这是一个非常好的解释。所以我的东西仍然是错误的,尽管一些矩阵数学可能已经补偿了错误的假设。 – praveen 2014-03-27 10:07:11

+0

谢谢。那么你知道我们的程序员,如果它看起来好像运行正常,那么怎么做并不重要。哈。但是,我真的添加了Google+线索的链接以显示混淆的另一方面。整个行列与列列的主要崩溃进一步模糊了这个问题。 – rswinkle 2014-03-29 03:09:12

+0

当然很抱歉,这是第一次真正使用StackOverflow。我的意思是更多的上述评论,但打回来,显然5分钟后我不能编辑它。无论如何,我会让它休息,但是这整个OpenGL的手性和矩阵行与col-major老鼠巢是我的宠物peeve。 – rswinkle 2014-03-29 03:20:53

4

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

错觉OpenGL是右撇子,因为在固定的管道,固定功能是右撇子,像glOrtho(...),glFrustrum(..),所有这些函数已被弃用在可编程管道时间。

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

忘了相机!

,因为我们的画面是2D plane.Imagine此,视口是一个黄色橡胶plane.pine这四个角落NDC。是这样的: enter image description here

在NDC所有顶点碰到上沿-z axis.That`s你实际画面上看到黄色的橡胶面。