OpenGL投影的内在相机矩阵。意外的缩放因子

时间:2016-09-10 17:40:41

标签: c++ opengl camera projection camera-calibration

我很难解决有关AR投影矩阵的一些问题。 我的基础是校准的相机矩阵。我试图检索OpenGL投影的投影矩阵。我几乎遵循这篇文章: http://ksimek.github.io/2013/06/03/calibrated_cameras_in_opengl/ 但结果太小,并且根据变换矩阵具有放大的偏移。 由于它太小,我来回改变参数以找出问题所在。

按照文章中描述的正确计算:

//p is the intrinsic camera matrix as you know it
glm::mat4x4 perspective, ndc;

perspective[0][0] = p[0][0];
perspective[0][1] = 0;
perspective[0][2] = 0;
perspective[0][3] = 0;
perspective[1][0] = 0;
perspective[1][1] = p[1][1];
perspective[1][2] = 0;
perspective[1][3] = 0;
perspective[2][0] = -p[2][0];
perspective[2][1] = -p[2][1];
perspective[2][2] = (gnear+gfar);
perspective[2][3] = -1;
perspective[3][0] = 0;
perspective[3][1] = 0;
perspective[3][2] = gnear*gfar;
perspective[3][3] = 0;


ndc[0][0] = 2.0f/(width);
ndc[0][1] = 0;
ndc[0][2] = 0;
ndc[0][3] = 0;
ndc[1][0] = 0;
ndc[1][1] = 2.0f/height;
ndc[1][2] = 0;
ndc[1][3] = 0;
ndc[2][0] = 0;
ndc[2][1] = 0;
ndc[2][2] = -2.0f/(gfar-gnear);
ndc[2][3] = 0;
ndc[3][0] = -((width/width));
ndc[3][1] = -((height/height));
ndc[3][2] = -((gfar+gnear)/(gfar-gnear));
ndc[3][3] = 1;

glm::mat4x4 proj2 = ndc*perspective;

这对我不起作用。

我做了这两个更改(添加0.5f因子):

perspective[2][2] = (gnear+gfar)*0.5f;
perspective[3][2] = gnear*gfar*0.5f;

这在某种程度上非常有效。我目前正在进行标记跟踪,并且生成的标记模型与实际的真实世界标记完美对齐。 遗憾的是,转换距离的映射似乎存在轻微错误。 外观是模型未正确缩放,具体取决于到原点的距离。我离开了标记,模型太小了。如果我达到某一点,模型就可以了。在此之后,它们太大了。我再说一遍:标记模型似乎始终正确映射。

我检查了我是否在缩放因子的初始错误方面犯了任何错误。但我找不到任何东西。

什么可能导致需要这种缩放?

据我所知,由于缺乏信息和代码,这个问题几乎无法回答,但也许有人有想法。

1 个答案:

答案 0 :(得分:0)

嗯,从近距离和远距离飞机的经验影响,你可以肯定地得出,有一些严重的错误。有什么不对,你不能扣除。在我的例子中,我有不同的矩阵数学框架的组合。一个框架工作专业,另一个专业。因此,我来​​回转换矩阵几次导致乘法顺序的反转。我删除了一个框架(Qt),现在所描述的投影矩阵的推导起作用。非常感谢stackoverflow。你总是帮我提出问题,所以我可以自己找到答案。