内部相机矩阵到 OpenGL 投影。意外的比例因子

Intrinsic Camera Matrix to OpenGL Projection. Unexpected Scaling Factor

我很难解决有关 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;

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

我检查了我是否对比例因子的初始误差有任何错误。但是我找不到任何东西。

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

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

好吧,从近平面和远平面的经验影响你可以明确地得出,有严重的错误。什么是错的,你不能扣除。就我而言,我结合了不同的矩阵数学框架。一个框架工程列专业,另一个是行专业。因此,我多次来回转置矩阵,导致乘法顺序颠倒。我删除了一个框架 (Qt),现在所描述的投影矩阵推导有效。非常感谢计算器。你总是帮我制定问题,所以我可以自己找到答案。