Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es OpenGL坐标系是右手坐标系还是左手坐标系?_Opengl Es_Coordinate Systems - Fatal编程技术网

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

Opengl es OpenGL坐标系是右手坐标系还是左手坐标系?,opengl-es,coordinate-systems,Opengl Es,Coordinate Systems,假设我在OpenGL ES 2.0程序上使用一个标识矩阵作为modelViewTransformation矩阵。本例中的坐标系是规范的OpenGL坐标系,它从(-1,-1,-1)扩展到(1,1,1) 这个坐标系是右手坐标系还是左手坐标系 一个更广泛的问题:是否有OpenGL文档可以列出API遵循的所有数学约定 我的问题是,这是坐标吗 系统是右手的还是左手的 默认情况下,OpenGL总是右撇子。您可以通过自动正常创建来观察这一点。可以通过为每个点指定左手法线来强制创建左手法线,但通常,右手规则始终

假设我在OpenGL ES 2.0程序上使用一个标识矩阵作为modelViewTransformation矩阵。本例中的坐标系是规范的OpenGL坐标系,它从(-1,-1,-1)扩展到(1,1,1)

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

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

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

默认情况下,OpenGL总是右撇子。您可以通过自动正常创建来观察这一点。可以通过为每个点指定左手法线来强制创建左手法线,但通常,右手规则始终适用。有关OpenGL纯右手特性的更多讨论,请参见

。。。所有的数学惯例 接下来是API

不清楚你想要什么。数学是基础线性代数,重点放在数学上

编辑回答评论问题:

但是,请记住,如果您使用的是统一矩阵调用,而不是较旧的GLR等,则必须指定您使用的是行主矩阵还是列主矩阵。在这种情况下(根据注释中提到的代码):

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

将其更改为
GL\u TRUE
,一切都会好起来

下面是OpenGL讨论板上与此特定主题相关的一篇文章


另一个编辑响应OpenGL中矩阵管道的注释请求。请注意带有三个轴的
GL\u MODELVIEW
图:它们表示右手坐标系。上述常见问题中的引用仍然适用。

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

规范化视图体积又称规范化设备坐标是/是左手坐标。通过传递单位矩阵并绘制两个三角形,这很容易测试

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_深度_测试))

因此,顶点着色器将如下所示:

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更改它,并将其设置为GLU更大

这是左撇子的进一步证明

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

编辑:为了回应鲍勃·克罗斯(Bob Cross)坚持认为我错了的观点,这里有一个单一的源文件程序可以证明我是对的

你可以在自述中看到截图

永远记住!!OPENGL只知道NDC,而且它是左撇子!

openGL是右撇子,因为在固定管道中,固定函数是右撇子,如glOrtho(…)、glFrustrum(…),所有这些函数在可编程管道时代都被弃用

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

忘了相机吧!

因为我们的屏幕是一个二维平面。想象一下,你的视口是一个黄色的橡胶平面。将这四个角放在NDC上。类似这样:


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

假设OpenGL是右手的。假设我在屏幕上绘制x,y轴,变换矩阵为恒等式,然后围绕z轴旋转θ=30度。因此,如果系统是右手的,旋转应该是occur逆时针旋转。但是,旋转恰好是顺时针的,表示左手系统。所以这让我很困惑。@praveen,我想你误解了操作顺序。如果你发布实际代码,原因会更清楚。请查看OpenGL常见问题解答中的9.070:@BobCross Hi Bob。我正在尝试在iOS上学习OpenGL ES。I bel请确保规范视图卷具有左手坐标系。我的程序中的代码可以在此处找到:[要尝试此代码,请使用此代码替换由XCode生成的iOS OpenGL模板项目中的render函数]如果角度为正且系统为右手,则旋转方向应为逆时针方向。与此相反,旋转方向为顺时针方向。@praveen,您的代码为
layout (location = 0) in vec4 v_vertex;

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