假设我在OpenGL ES 2.0程序中为模型视图转换矩阵使用单位矩阵。在这种情况下,坐标系是从(-1,-1,-1)到(1,1,1)的典型OpenGL坐标系。
这个坐标系是右手坐标系还是左手坐标系?
更广泛的问题是:是否有一份OpenGL文档可以列出API遵循的所有数学约定?
假设我在OpenGL ES 2.0程序中为模型视图转换矩阵使用单位矩阵。在这种情况下,坐标系是从(-1,-1,-1)到(1,1,1)的典型OpenGL坐标系。
这个坐标系是右手坐标系还是左手坐标系?
更广泛的问题是:是否有一份OpenGL文档可以列出API遵循的所有数学约定?
OpenGL看起来是右手坐标系的幻象,是因为在固定管线中,固定函数是右手坐标系的,比如glOrtho(...)、glFrustrum(...)。所有这些函数在可编程管线时代都已经被弃用了。
OpenGL不关心你在中间矩阵处理中使用的坐标系。你可以使用任何轴坐标系,只要将其转换为NDC即可。
因为我们的屏幕是一个二维平面。想象一下,你的视口是一个黄色的橡皮正方形。将该正方形的四个角钉在NDC的-Z侧,就像这样:
在NDC空间中,所有-Z轴上的顶点都在黄色橡胶正方形上,并定义它。然后将黄色橡胶平面拉伸以适应并显示在您的实际屏幕上。
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 };
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;
}
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将其更改为右手坐标系行为。glUniformMatrix4fv(uniforms[UNIFORM_MVP], 16, GL_FALSE, mvpMatrixZRotation);
GL_FALSE
表示这是一个列主矩阵,因此旋转的结果将是预期的转置。因此,旋转将被反转,看起来像一个左手坐标系。GL_TRUE
,一切都会好起来。GL_MODELVIEW
图表:它们说明了右手坐标系。上述FAQ中的引用仍然适用。Opengl ES坐标系实际上是右手坐标系,包括规范化体积从(-1,-1,-1)到(1,1,1)。我已经通过代码进行了验证。