OpenGL投影的固有相机矩阵.意想不到的比例因子

Intrinsic Camera Matrix to OpenGL Projection. Unexpected Scaling Factor

本文关键字:意想不到 投影 相机 OpenGL      更新时间:2023-10-16

我有相当困难的时间修复一些关于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),现在描述的投影矩阵的推导工作。非常感谢stackoverflow。你总是帮我构思问题,所以我可以自己找到答案。