如何从相机投影矩阵中获取相机变换矩阵?

时间:2013-09-18 02:50:53

标签: graphics matrix camera transform camera-calibration

嗨我有一个相机投影矩阵,我想获得相应的相机变换矩阵。

投影矩阵(P)为3 * 4,它将3D点的齐次坐标转换为平面齐次坐标。

现在在我的场景中,我只能指定相机变换矩阵,它描述了相机的定位方式。那么如何从相机投影矩阵中获得矩阵变换矩阵?

修改

从数据集中读取投影矩阵,我正在尝试渲染该数据。但渲染采用尺寸为3 * 4的相机变换矩阵,而数据集提供投影矩阵3 * 4。这两个矩阵的区别在于:变换矩阵是全等的,而投影则不是。将投影矩阵直接传递到变换中会产生“相机上的非全等变换”错误。

1 个答案:

答案 0 :(得分:0)

修改

好的,所以渲染库有一个固定的投影,你不能改变,但你仍然想要使用自己的投影。由于除以零,标准透视变换确实是非一致的(矩阵本身虽然是afaik是全等的,你确定数据集不提供无效的投影矩阵吗?)但是因为所有点都被夹在近和远之间那里的飞机通常不是问题。

如果你可以提取渲染引擎使用的实际投影矩阵,也许你可以计算与它相乘的矩阵产生所需的投影矩阵。

  • 图书馆执行此操作:csVert = libProjectionMat * M * objectMat * osVert,其中M是提供给图书馆的相机转换
  • 你想要这个:csVert = myProjectionMat * myCameraMat * objectMat * osVert
  • 但您只能设置M
  • 因此找到M
  • libProjectionMat * M = myProjectionMat * myCameraMat
  • libProjectionMatInverse * libProjectionMat * M = libProjectionMatInverse * myProjectionMat * myCameraMat
  • M = libProjectionMatInverse * myProjectionMat * myCameraMat

然后通过M作为相机转换。如果图书馆仍然报告M不一致,我认为您无法做到。这听起来像是一个非常不灵活的库。


通常使用4x4矩阵,3x4是否有任何原因?组合矩阵为projection * camera(或projection * view)。也可能存在对象/模型变换,在这种情况下mvp = projection * view * model(所有标准矩阵倍数)。此矩阵将对象空间中的顶点一直带到2D剪辑空间(不要忘记除以w以对齐次坐标进行标准化,但只有在发生任何插值后才会生成。)

你的问题有点不清楚 如果您只能在方案中指定单个矩阵,那么传入mvpprojection * view是否可以解决您的问题?

如果您有最终矩阵并希望提取view * model分量,则可以将mvp乘以反投影:mv = projectionInv * mvp。这比仅保持所有矩阵和/或组合分开更昂贵,当然不太准确。