投影矩阵产生不正确的结果

时间:2015-01-08 00:16:02

标签: c++ opengl math perspectivecamera glm-math

我目前正在尝试创建一个Perspective函数,它可以为OpenGL生成一个Projection。我已经创建了许多方法,最新的复制GLM函数来处理它(我必须使用我自己的Matrix4类来完成我的任务)。无论我尝试什么代码,与GLM相比,我总是会产生不正确的数字,这导致我的立方体只能使用GLM进行渲染。

它们都使用相同的变量初始化

glm::mat4 ProjectionGLM = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
Matrix4 Projection = Matrix4::Perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);

透视功能

Matrix4 Matrix4::Perspective(double fov, double aspect, double zNear, double zFar) {
double fovy = fov * 0.0174532925;

double const tanHalfFovy = tan(fovy / 2.0f);

Matrix4 temp;
temp.data[0][0] = 1.0f / (aspect * tanHalfFovy);
temp.data[1][1] = 1.0f / (tanHalfFovy);
temp.data[2][2] = -(zFar + zNear) / (zFar - zNear);
temp.data[2][3] = -1.0f;
temp.data[3][2] = -(2.0f * zFar * zNear) / (zFar - zNear);
return temp;

代码直接在GLM之后建模,减去static_cast和模板。它与我尝试过的许多其他功能相同。然而,结果矩阵是不同的。

GLM结果

1.34444320 0          0            0
0          1.79259098 0            0
0          0          -1.00200200  -1.00000000
0          0          -0.200200200 0

我的结果

1.81066012 0          0            0
0          2.41421366 0            0
0          0          -1.00200200  -1.00000000
0          0          -0.200200200 0

对于我的透视功能可能出现什么问题或者GLM可能采用不同的做法有什么想法?

链接到我的数学库(只是.h和.cpp文件) https://mega.co.nz/#!lokhCBaB!5r7GwpWhEZ-tUcXV_ccxmQvZgRwIVU8K7dlIffVqZic

1 个答案:

答案 0 :(得分:1)

GLM以弧度为单位取FOV角度,而传递的值(45.0)以度为单位。

参数的GLM documentation几乎不清楚:

  

指定y方向的视角范围(以度为单位)。以弧度表示。

是的,两者都说它是以度和弧度表示的。但是如果你看一下源代码,它确实是弧度的。

这与您的结果一致。对于矩阵元素[2][2],它是:

1.0 / tan(0.5 * fov)

使用弧度运算的tan()函数进行评估,直接使用45.0会产生以下结果:

1.0 / tan(0.5 * 45.0) = 1.0 / tan(22.5) = 1.79251

首先将角度转换为弧度:

1.0f / tan(0.5 * 45.0 * pi / 180.0) = 1.0 / tan(0.3927) = 2.41421

因此,如果您将GLM版本的输入角度转换为弧度,我的预测是您将获得与您自己计算的值相同的值:

glm::mat4 ProjectionGLM = glm::perspective(45.0f * M_PI / 180.0f, 4.0f / 3.0f, 0.1f, 100.0f);