假设我在OpenGL ES 2.0程序上为我的modelViewTransformation矩阵使用了标识矩阵。这种情况下的坐标系统是从(-1,-1,-1)延伸到(1,1,1)的规范OpenGL坐标系统。OpenGL坐标系是右手还是左手?
这个坐标系是右手还是左手?
一个更广泛的问题:是否有与OpenGL的一份文件,其中可以列出所有的数学约定其次是API?
假设我在OpenGL ES 2.0程序上为我的modelViewTransformation矩阵使用了标识矩阵。这种情况下的坐标系统是从(-1,-1,-1)延伸到(1,1,1)的规范OpenGL坐标系统。OpenGL坐标系是右手还是左手?
这个坐标系是右手还是左手?
一个更广泛的问题:是否有与OpenGL的一份文件,其中可以列出所有的数学约定其次是API?
我的问题是,这是坐标 系统右手还是左手?
默认情况下,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
图:它们说明了右手坐标系。常见问题解答中的上述引用仍然适用。
的OpenGL ES坐标系统确实是右撇子的系统包括(-1,-1,-1)到(1,1,1)的典型量。我通过代码验证了这一点。
规范视图体积(也称为标准化设备坐标)是左撇子。这是很容易测试通过将单位矩阵和绘图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
哇!这是一个非常好的解释。所以我的东西仍然是错误的,尽管一些矩阵数学可能已经补偿了错误的假设。 – praveen 2014-03-27 10:07:11
谢谢。那么你知道我们的程序员,如果它看起来好像运行正常,那么怎么做并不重要。哈。但是,我真的添加了Google+线索的链接以显示混淆的另一方面。整个行列与列列的主要崩溃进一步模糊了这个问题。 – rswinkle 2014-03-29 03:09:12
当然很抱歉,这是第一次真正使用StackOverflow。我的意思是更多的上述评论,但打回来,显然5分钟后我不能编辑它。无论如何,我会让它休息,但是这整个OpenGL的手性和矩阵行与col-major老鼠巢是我的宠物peeve。 – rswinkle 2014-03-29 03:20:53
ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!
错觉OpenGL是右撇子,因为在固定的管道,固定功能是右撇子,像glOrtho(...),glFrustrum(..),所有这些函数已被弃用在可编程管道时间。
OpenGL并不关心你用于中间矩阵过程的什么手指坐标系。如果需要,您可以使用轴坐标系,只要您将其镜像到NDC即可。
忘了相机!
,因为我们的画面是2D plane.Imagine此,视口是一个黄色橡胶plane.pine这四个角落NDC。是这样的:
在NDC所有顶点碰到上沿-z axis.That`s你实际画面上看到黄色的橡胶面。
可以说OpenGL是右撇子。比方说,我在屏幕上绘制变换矩阵为Identity的x,y轴,然后围绕z轴旋转角度theta = 30 Degrees。所以如果系统是右手的,那么应该逆时针旋转。然而,旋转恰好是顺时针指示左手系统。所以这让我很困惑。 – praveen 2011-03-03 07:44:37
@praveen,我认为你误解了操作的顺序。如果您发布实际代码,原因将变得更加清晰。在OpenGL FAQ中检查9.070:http://www.opengl.org/resources/faq/technical/transformations.htm – 2011-03-03 13:21:30
@BobCross Hi Bob。我正在尝试在iOS上学习OpenGL ES。我相信规范的视图体积有一个左手坐标系统。我的程序代码可以在这里找到:[链接](http://pastie.org/1628587)。 [要尝试这个代码,只需用这个代码替换XCode生成的iOS OpenGL模板项目中的渲染函数]。假设角度为正,系统是右手的,则旋转应该以逆时针方向进行。与此相反,旋转发生在顺时针方向。 – praveen 2011-03-03 13:55:53