Graphics 如何从摄像机投影矩阵中得到摄像机变换矩阵?
嗨,我有一个摄像机投影矩阵,我想得到相应的摄像机变换矩阵 投影矩阵(p)为3*4,将3D点的齐次坐标转换为平面齐次坐标 现在在我的场景中,我只能指定摄影机变换矩阵,它描述了摄影机的位置。那么如何从摄像机投影矩阵中得到矩阵变换矩阵呢 编辑 投影矩阵是从数据集中读取的,我正试图呈现这些数据。但是渲染采用大小为3*4的摄影机变换矩阵,而数据集提供投影矩阵3*4。这两个矩阵的区别在于:变换矩阵是全等的,而投影矩阵不是全等的。将投影矩阵直接传递到变换中会产生“相机上的非全等变换”错误。编辑 好的,所以渲染库有一个固定的投影,您不能更改它,但仍然希望使用自己的投影。由于被零除,标准透视变换确实是非全等的(矩阵本身是全等的,尽管afaik,您确定数据集没有提供无效的投影矩阵吗?),但由于所有点都在近平面和远平面之间剪裁,因此通常不存在问题 如果可以提取渲染引擎使用的实际投影矩阵,则可能可以计算矩阵,该矩阵与之相乘后生成所需的投影矩阵Graphics 如何从摄像机投影矩阵中得到摄像机变换矩阵?,graphics,matrix,camera,transform,camera-calibration,Graphics,Matrix,Camera,Transform,Camera Calibration,嗨,我有一个摄像机投影矩阵,我想得到相应的摄像机变换矩阵 投影矩阵(p)为3*4,将3D点的齐次坐标转换为平面齐次坐标 现在在我的场景中,我只能指定摄影机变换矩阵,它描述了摄影机的位置。那么如何从摄像机投影矩阵中得到矩阵变换矩阵呢 编辑 投影矩阵是从数据集中读取的,我正试图呈现这些数据。但是渲染采用大小为3*4的摄影机变换矩阵,而数据集提供投影矩阵3*4。这两个矩阵的区别在于:变换矩阵是全等的,而投影矩阵不是全等的。将投影矩阵直接传递到变换中会产生“相机上的非全等变换”错误。编辑 好的,所以渲染
- 库执行以下操作:
,其中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、纵横比、近平面和远平面,您可以自己重建投影矩阵)?另外,你确定你使用的投影矩阵是有效的吗(你自己倒过来试试)?我建议你看看这个:和。你的问题非常常见,在论坛和网络上已经被回答了很多次。小小的搜索应该会让你走很长的路。