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),现在描述的投影矩阵的推导工作。非常感谢stackoverflow。你总是帮我构思问题,所以我可以自己找到答案。
相关文章:
- 为什么在递归中使用循环会产生意想不到的结果?
- 应用投影矩阵后对象消失
- 在其特征向量上投影点云
- 在 OpenGL 中使用透视与正交投影时的光线投射(鼠标拾取)
- 字符到int8_t转换会产生意想不到的结果?
- 康威的生命游戏帮助我理解这个意想不到的输出
- 正交投影设置
- 使用 CGAL 将多面体投影到 xy 平面
- 将粒子投影到立方体的表面
- libc++ 对 std::map/set::equal_range 的实现给出了意想不到的结果
- 缩小在正交投影中不起作用
- 使用 GDAL/OGR C++将 GeoTiff 的 XY 点重新投影到纬度/经度
- OpenGL 透视投影裁剪多边形与顶点在视锥体之外 = 错误的纹理映射?
- 微小加密算法实现会产生意想不到的结果
- 使用 std::set 的 .begin() 和 .end() 函数会产生意想不到的结果
- OPENCV球形投影:翘曲和不折磨
- 3D透视图投影,带有摄像头旋转
- 将投影转换为正交光线投射
- 在我的C++链表实现中取消引用节点指针,给出意想不到的结果
- OpenGL投影的固有相机矩阵.意想不到的比例因子