从仿射摄影机矩阵创建OpenGL矩阵

从仿射摄影机矩阵创建OpenGL矩阵,opengl,computer-vision,rendering,camera-calibration,Opengl,Computer Vision,Rendering,Camera Calibration,我有一组2D到3D的点对应,我根据这些对应估计仿射相机矩阵(基本上,假设正交投影)[1]。摄像机估计的输出是一个3x4矩阵,其中第三行是[0,0,0,1](“仿射约束”) 现在从这个相机矩阵,我想用OpenGL渲染我的模型。因此,本质上,从我的相机矩阵创建一个模型视图和一个(正交的)投影矩阵 我已经阅读了数小时有关相机矩阵解剖/分解的材料,但都是关于透视相机的,由于矩阵中缺少“z”信息,我无法应用这些技术 我尝试了很多尝试,大多数都在很早的阶段就失败了。我尝试过的一件事是使用矩阵第一行和第二行的

我有一组2D到3D的点对应,我根据这些对应估计仿射相机矩阵(基本上,假设正交投影)[1]。摄像机估计的输出是一个
3x4
矩阵,其中第三行是
[0,0,0,1]
(“仿射约束”)

现在从这个相机矩阵,我想用OpenGL渲染我的模型。因此,本质上,从我的相机矩阵创建一个
模型视图
和一个(正交的)
投影
矩阵

我已经阅读了数小时有关相机矩阵解剖/分解的材料,但都是关于透视相机的,由于矩阵中缺少“z”信息,我无法应用这些技术

我尝试了很多尝试,大多数都在很早的阶段就失败了。我尝试过的一件事是使用矩阵第一行和第二行的点积(当然没有最后一列)来创建一个新行,它转换
z
,但它只是
[0,0,1]
,这当然是有意义的。 我尝试的另一件事是在估计相机矩阵之前将2D点转换为剪辑坐标空间(即“反转”窗口变换),这样我就可以进行窗口变换并从图片中翻转y(在我的屏幕空间中,原点在左上角)

坦率地说,我不知道如何从根本上解决这个问题

[1] :从世界到图像对应估计仿射相机矩阵的金标准算法,多视图几何中的算法7.2,Hartley&Zisserman,第二版,2003。

仿射相机(参见示例)仅执行正交投影,然后执行仿射扭曲

鉴于OpenGL正交相机可以始终用作任意图像变换的光栅化设备,仿射相机可以如下模拟:

  • 为场景创建正交摄影机。渲染场景 使用它,读回生成的图像
  • 通过将所述仿射变换作为纹理变换矩阵,将相机模型诱导的仿射变换应用于该图像
  • 在正交相机(一张“卡片”)前面渲染一个覆盖其视野的矩形,并使用步骤1中生成的图像对所述矩形进行纹理处理。它将根据要求使用仿射变换进行扭曲
  • 如果性能有问题,可以优化此序列。阅读“渲染到纹理”了解如何操作。

    仿射摄影机(参见示例)只执行正交投影,然后执行仿射扭曲

    鉴于OpenGL正交相机可以始终用作任意图像变换的光栅化设备,仿射相机可以如下模拟:

  • 为场景创建正交摄影机。渲染场景 使用它,读回生成的图像
  • 通过将所述仿射变换作为纹理变换矩阵,将相机模型诱导的仿射变换应用于该图像
  • 在正交相机(一张“卡片”)前面渲染一个覆盖其视野的矩形,并使用步骤1中生成的图像对所述矩形进行纹理处理。它将根据要求使用仿射变换进行扭曲

  • 如果性能有问题,可以优化此序列。阅读“渲染到纹理”了解如何进行。

    我不确定这是否回答了我的问题。在估计了5个点的仿射相机之后,我有了一个完整的3D模型,我想使用所说的相机矩阵和OpenGL来渲染它。我不想扭曲我的图像-我想渲染我的模型。请澄清你的“模型”是什么:一个由三角剖分的3D点组成的网格,在一个视图中使用Delaunay三角剖分构建拓扑?是的,这是一个普通3D网格,就像你在游戏引擎中遇到的一样。一个由三角形组成的立方体,如果你愿意的话。编辑答案以澄清。看看这里,我不确定这是否回答了我的问题。在估计了5个点的仿射相机之后,我有了一个完整的3D模型,我想使用所说的相机矩阵和OpenGL来渲染它。我不想扭曲我的图像-我想渲染我的模型。请澄清你的“模型”是什么:一个由三角剖分的3D点组成的网格,在一个视图中使用Delaunay三角剖分构建拓扑?是的,这是一个普通3D网格,就像你在游戏引擎中遇到的一样。一个由三角形组成的立方体,如果你愿意的话。编辑答案来澄清。看看这里