Graphics 如何从摄像机投影矩阵中得到摄像机变换矩阵?

Graphics 如何从摄像机投影矩阵中得到摄像机变换矩阵?,graphics,matrix,camera,transform,camera-calibration,Graphics,Matrix,Camera,Transform,Camera Calibration,嗨,我有一个摄像机投影矩阵,我想得到相应的摄像机变换矩阵 投影矩阵(p)为3*4,将3D点的齐次坐标转换为平面齐次坐标 现在在我的场景中,我只能指定摄影机变换矩阵,它描述了摄影机的位置。那么如何从摄像机投影矩阵中得到矩阵变换矩阵呢 编辑 投影矩阵是从数据集中读取的,我正试图呈现这些数据。但是渲染采用大小为3*4的摄影机变换矩阵,而数据集提供投影矩阵3*4。这两个矩阵的区别在于:变换矩阵是全等的,而投影矩阵不是全等的。将投影矩阵直接传递到变换中会产生“相机上的非全等变换”错误。编辑 好的,所以渲染

嗨,我有一个摄像机投影矩阵,我想得到相应的摄像机变换矩阵

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

现在在我的场景中,我只能指定摄影机变换矩阵,它描述了摄影机的位置。那么如何从摄像机投影矩阵中得到矩阵变换矩阵呢

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

编辑

好的,所以渲染库有一个固定的投影,您不能更改它,但仍然希望使用自己的投影。由于被零除,标准透视变换确实是非全等的(矩阵本身是全等的,尽管afaik,您确定数据集没有提供无效的投影矩阵吗?),但由于所有点都在近平面和远平面之间剪裁,因此通常不存在问题

如果可以提取渲染引擎使用的实际投影矩阵,则可能可以计算矩阵,该矩阵与之相乘后生成所需的投影矩阵

  • 库执行以下操作:
    csVert=libProjectionMat*M*objectMat*osVert
    ,其中
    M
    是提供给库的摄影机变换
  • 您需要以下内容:
    csVert=myProjectionMat*myCameraMat*objectMat*osVert
  • 但您只能设置
    M
  • 因此,查找
    libProjectionMat*M=myProjectionMat*myCameraMat的
    M
  • libProjectionMatInverse*libProjectionMat*M=libProjectionMatInverse*myProjectionMat*myCameraMat
  • M=libProjectionMatInverse*myProjectionMat*myCameraMat
然后在相机变换时传递
M
。如果库仍然将
M
报告为非一致性,我认为您也无能为力。这听起来像是一个相当死板的图书馆


一直使用4x4矩阵是很常见的,有什么理由使用3x4吗?组合矩阵为
projection*camera
(或
projection*view
)。也可能存在对象/模型转换,在这种情况下,
mvp=projection*view*model
(所有标准矩阵倍数)。该矩阵将对象空间中的一个顶点一直带到二维剪辑空间(不要忘记除以
w
以规范化齐次坐标,但仅在发生任何插值之后)

你的问题有点不清楚。
如果您只能在场景中指定一个矩阵,传入
mvp
projection*view
是否解决了您的问题


如果您拥有最终矩阵,并且希望提取
view*model
组件,则可以将
mvp
乘以逆投影:
mv=projectionInv*mvp
。这比单独保存所有矩阵和/或组合成本更高,当然精度更低。

谢谢您的回答。转换矩阵的原因已在更新部分中阐明。将顶点放入2D剪辑空间的过程由3D渲染引擎处理。@请参见编辑。库是否提供了投影矩阵(或者,如果您知道fov、纵横比、近平面和远平面,您可以自己重建投影矩阵)?另外,你确定你使用的投影矩阵是有效的吗(你自己倒过来试试)?我建议你看看这个:和。你的问题非常常见,在论坛和网络上已经被回答了很多次。小小的搜索应该会让你走很长的路。