pra*_*een 5 opengl-es coordinate-systems
假设我在OpenGL ES 2.0程序中为我的modelViewTransformation矩阵使用Identity Matrix.在这种情况下,坐标系统是规范的OpenGL坐标系统,它从(-1,-1,-1)延伸到(1,1,1).
这个坐标系是右手还是左手?
一个更广泛的问题:是否有一个OpenGL文档可以列出API遵循的所有数学约定?
我的问题是,这个坐标系是右手还是左手?
默认情况下,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带有三个轴的图表:它们说明了右手坐标系.常见问题解答中的上述引用仍然适用.
规范视图体积(又名标准化设备坐标)是左手坐标。通过传递单位矩阵并绘制 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/
ALWAYS REMEMBER!! OPENGL ONLY KNOWS NDC ,AND IT IS LEFT_HANDED!
幻觉openGL是右手,因为在固定管道中,固定功能是正确的,如glOrtho(...),glFrustrum(..),所有这些功能都在可编程 - 管线时代被弃用.
OpenGL并不关心用于中间矩阵过程的坐标系统.如果需要,可以使用轴坐标系,只要将其镜像到NDC即可.
忘了相机!
因为我们的屏幕是2D平面.想象一下,你的视口是一个黄色的橡胶平面.这四个角落到NDC.这样的事情:

NDC中的所有顶点都沿着-z轴撞击在黄色橡胶平面上.这就是你在真实屏幕上看到的内容.
| 归档时间: |
|
| 查看次数: |
8637 次 |
| 最近记录: |