Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/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左手坐标系_Opengl_Matrix_Projection - Fatal编程技术网

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; } 我所有的矩阵都存储在主行,我使用左手透视矩阵作为投影矩阵 问题是

我正在编写一个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规范显示了坐标系的期望值,但在查看之后,我没有看到这对我有什么帮助

编辑: 作为参考,我的投影矩阵代码是基于

编辑: 根据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);