OpenGL左手坐标系
我正在编写一个3D OpenGL应用程序,我的顶点转换矩阵有问题 这是我的顶点着色器:OpenGL左手坐标系,opengl,matrix,projection,Opengl,Matrix,Projection,我正在编写一个3D OpenGL应用程序,我的顶点转换矩阵有问题 这是我的顶点着色器: attribute vec4 vInPos; uniform mat4 kWorld; uniform mat4 kProj; void main( void ) { vec4 world_pos = kWorld * vInPos; gl_Position = kProj * world_pos; } 我所有的矩阵都存储在主行,我使用左手透视矩阵作为投影矩阵 问题是
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规范显示了坐标系的期望值,但在查看之后,我没有看到这对我有什么帮助
编辑:
作为参考,我的投影矩阵代码是基于
编辑:
根据Nicol Bolas的建议,我现在使用的是来自的矩阵,但得到的结果相同
下面是我用来设置矩阵的代码:
/* 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);
使用此代码,我的文本根本不会显示
编辑:不确定它是否相关,但我正在OSX雪豹上使用OpenGL2.0
我用的是左手透视矩阵
别这样
同样重要的是,投影矩阵(剪辑空间)的输出对于OpenGL和D3D是不同的。您不能仅仅获取一个D3D投影矩阵,对其进行转置,然后期望GLSL能够很好地接受输出
同样,查一下并使用这个矩阵
根据Nicol Bolas的建议,我现在从Glu的角度使用矩阵,但我得到了相同的结果 你可能还使用了一堆其他的左手矩阵。您的模型到摄影机矩阵需要是右手的。此外,顶点数据也需要右撇子。或者,您可以尝试从左手空格转换为右手空格,但除非您别无选择,否则我不会建议您这样做
fov
是以度为单位的角度tanf
以弧度表示角度。30.0f
的tanf
是一个负数,这意味着透视矩阵中的视锥体比例为负数。这将有效地反转视图的X轴和Y轴
您真正需要的是:
float f = 1.0f/tanf((fov * 6.2831f / 360.0f ) / 2.0f);
我曾经听过这样的话,从左手坐标系切换到右手坐标系,只需反转其中一个轴。(即:与(1,1,1)相反,你可能有(1,1,-1)。)他们说,你翻转哪一个并不重要,但很明显,对于给定的期望结果,有些比其他更好。我尝试过一次反转每个轴。翻转X轴或Y轴不会影响结果,翻转Z轴完全消除了渲染。我已经关闭了筛选功能,所以我的抽奖电话并不是被筛选的。我很抱歉,我不小心输入了右键而不是左键。我用的是左手透视矩阵。我更新了我原来的问题。我不再用左手了。我的矩阵是使用gluPerspective的数学构建的,而我的世界矩阵只是一个身份矩阵,
worldMatrix[12]=100,worldMatrix[13]=100,worldMatrix[14]=100
。我的4个顶点是顶点[]={{0,0},{50,0},{0,50},{50,50}
。我关闭了消隐功能,只是为了确保在我尝试进行更改时它们不会被消隐,我有两个索引缓冲区,一个是顺时针的,一个是逆时针的,我已经测试了这两个。似乎没有什么能改变结果。@Kyle:标准OpenGL透视矩阵设置的相机空间在相机前面有-Z,后面有+Z。所以,如果你将顶点平移100,并且你仍然看到它们,那么你仍然在某处有一些糟糕的矩阵。你能把你正在使用的实际矩阵和你用来渲染它们的glUniformMatrix代码一起添加到你的答案中吗?我已经用我正在使用的实际代码更新了我的问题。我仍然看到同样的结果。当我转换我的世界矩阵时,我的文本消失了。我没有转置它,因为它说转换应该在索引13、14和15中,它们在我的矩阵中。但不管怎样,转置使我的文字消失了。我觉得我遗漏了一些小细节,但我不确定是什么。
float f = 1.0f/tanf((fov * 6.2831f / 360.0f ) / 2.0f);