繁体   English   中英

OpenGL左手坐标系

[英]OpenGL left-handed coordinate system

我正在编写一个3D OpenGL应用程序,但我的顶点转换矩阵遇到了问题。

这是我的顶点着色器:

attribute vec4     vInPos;

uniform mat4    kWorld;
uniform mat4    kProj;

void main( void )
{
    vec4 world_pos = kWorld * vInPos;
    gl_Position = kProj * world_pos;
}

我所有的矩阵都存储在专业行中,我使用的是左手透视图矩阵作为我的投影矩阵。

问题是,当我通过矩阵平移一个顶点时,它在X轴和Y轴上都沿错误的方向移动并被翻转。 因此,通过(100.0f,100.0f,100.0f)平移将顶点在Z轴上正确移动(远离相机),但在X轴上向左移动(向后),在Y轴上向下移动(向后) 。

这是当前的样子: 屏幕截图

FPS计数器应在右上方,而不是在左下方。 显然也不应镜像。 根据我所读的内容,发生这种情况是因为OpenGL默认使用右手坐标系,但是我不确定该如何解决。

我找到了几篇文章试图对其进行解释,但找不到针对该问题的任何解决方案。 这个问题提到OpenGL规范显示了坐标系的期望,但是看了之后,我没有看到它对我有什么帮助。

编辑:供参考,我的投影矩阵代码基于DirectX SDK

编辑:根据尼科尔·波拉斯的建议,我现在使用的是来自gluPerspective的矩阵,但我得到的结果相同。


这是我用来设置矩阵的代码:

/* Vertex data for reference
float vertices[] =
{
    {0.0f,0.0f,0.0f},
    {5.0f,0.0f,0.0f},
    {0.0f,5.0f,0.0f},
    {5.0f,5.0f,0.0f},
}; */    
float worldf[16];
float projf[16];
float fov       = 60.0f;
float aspect    = 1280.0f/720.0f;
float near      = 1.0f;
float far       = 1000.0f;
float f         = 1.0f/tanf( (fov*6.2831f/360.0f)/2.0f );

/* Build world matrix */
memset(worldf, 0, sizeof(worldf));
worldf[0] = worldf[5] = worldf[10] = worldf[15] = 1.0f;
worldf[12] = 100.0f;
worldf[13] = 100.0f;
worldf[14] = -100.0f;

/* Build perspective matrix */
memset(projf, 0, sizeof(projf));
projf[0] = f/aspect;
projf[5] = f;
projf[10] = (far+near)/(near-far);
projf[14] = (2.0f*far*near)/(near-far);
projf[11] = -1.0f;

glUniformMatrix4fv(proj_uniform, 1, GL_FALSE, projf);
glUniformMatrix4fv(world_uniform, 1, GL_FALSE, worldf);

使用此代码,我的文本完全不会显示。

编辑:不确定是否相关,但是我在OS X Snow Leopard上使用OpenGL 2.0。

我正在使用左手透视矩阵

别那样做。

同样重要的是,对于OpenGL和D3D,投影矩阵的输出(剪辑空间)是不同的。 您不能只是获取D3D投影矩阵,对其进行转置,并期望GLSL能够很好地接受输出。

因此,再次查找gluPerspective并使用该矩阵。


根据Nicol Bolas的建议,我现在使用的是gluPerspective的矩阵,但得到的结果相同。

您可能还使用了一堆其他左手矩阵。 您的“模型到相机”矩阵必须是惯用右手的。 同样,您的顶点数据也需要右手操作。 另外,您可以尝试从左手空间转换为右手空间,但是除非您别无选择,否则我不建议您这样做。


float f = 1.0f/tanf(fov/2.0f);

fov是一个角度,以度为单位。 tanf弧度表示一个角度。 tanf30.0f为负数,这意味着透视矩阵中的平截头体比例为负。 这样可以有效地反转视图的X和Y轴。

您真正需要的是:

float f = 1.0f/tanf((fov * 6.2831f / 360.0f ) / 2.0f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM