opengl 查找矩阵到相机外部矩阵

问题描述

我正在尝试从我从 opengl 帧缓冲区中保存的深度数据渲染 3D 点云。基本上,对于以 (0,0) 为中心的渲染模型,我从不同的 n 视点(已知)获取了不同的深度样本。我成功保存了深度图,但现在我想从这些深度图中提取 x、y、z 协调。为此,我回到了从图像到世界的投影点。为了获得世界坐标,我使用以下等式 P = K_inv [R|t]_inv * p. 来计算世界坐标。

为了计算图像内在矩阵,我使用了来自 opengl 相机矩阵的信息,glm::perspective(fov,aspect,near_plane,far_plane)。固有矩阵 K 计算为

enter image description here

其中

enter image description here

如果我在相机原点变换坐标(即,没有外在变换 [R|t]),我会得到单个图像的 3D 模型。为了融合多个深度图,我还需要从 OpenGL 观察矩阵 glm::lookat(eye=n_viewpoint_coorinates,center=(0,0),up=(0,1,0))。外部矩阵计算如下(参考:http://ksimek.github.io/2012/08/22/extrinsic/

enter image description here

但是当我融合两个深度图像时,它们没有对齐。我认为外部矩阵不正确。我也尝试直接使用 glm::lookat 矩阵,但这也不起作用。融合后的模型快照如下图

enter image description here

有人可以建议,我的方法有什么问题。是外部矩阵出错了吗(我非常确定)?

解决方法

最后,我自己设法解决了这个问题。我没有在 OpenGL 内部进行转换,而是在 OpenGL 外部进行转换。基本上,我保持相机恒定并与模型保持一定距离,并对模型进行旋转变换,然后最终在没有观察矩阵(或仅 4x4 单位矩阵)的情况下渲染模型。我不知道为什么使用观察矩阵没有给我结果,或者可能是因为我遗漏了一些东西。要将模型反向投影到世界坐标中,我只需对我最初在将模型提供给 OpenGL 之前所做的精确变换进行逆运算。