嗨我有一个相机投影矩阵,我想获得相应的相机变换矩阵。
投影矩阵(P)为3 * 4,它将3D点的齐次坐标转换为平面齐次坐标。
现在在我的场景中,我只能指定相机变换矩阵,它描述了相机的定位方式。那么如何从相机投影矩阵中获得矩阵变换矩阵?
从数据集中读取投影矩阵,我正在尝试渲染该数据。但渲染采用尺寸为3 * 4的相机变换矩阵,而数据集提供投影矩阵3 * 4。这两个矩阵的区别在于:变换矩阵是全等的,而投影则不是。将投影矩阵直接传递到变换中会产生“相机上的非全等变换”错误。
答案 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
以对齐次坐标进行标准化,但只有在发生任何插值后才会生成。)
你的问题有点不清楚
如果您只能在方案中指定单个矩阵,那么传入mvp
或projection * view
是否可以解决您的问题?
如果您有最终矩阵并希望提取view * model
分量,则可以将mvp
乘以反投影:mv = projectionInv * mvp
。这比仅保持所有矩阵和/或组合分开更昂贵,当然不太准确。