当构建计算机图形渲染器(例如传统的软件渲染器)时,常常使用模型矩阵、视图矩阵和投影矩阵。模型通过模型矩阵转换到世界空间,然后通过视图矩阵将所有内容转换到相机空间,之后进行投影到归一化设备坐标。通常会根据视锥体对三角形进行裁剪,并在必要时拆分三角形。然后将所有可见的三角形投影到屏幕空间并绘制。(例如 Shirley 的《计算机图形学基础》)。
另一方面,在讨论从点对应中估计相机姿态的计算机图形学中,透视-n-点问题(PnP,例如http://cvlab.epfl.ch/software/EPnP),这些算法直接估计一个相机矩阵,该矩阵将对象从模型空间转换为窗口坐标(例如640x480)。
我的问题是如何将这两者联系起来。如果我从PnP算法中获得一个相机矩阵,它似乎不适用于渲染流水线。它们如何联系起来?我如何正确地实现我的软件渲染器,使其也能与PnP算法中的不同相机矩阵一起工作?
另一方面,在讨论从点对应中估计相机姿态的计算机图形学中,透视-n-点问题(PnP,例如http://cvlab.epfl.ch/software/EPnP),这些算法直接估计一个相机矩阵,该矩阵将对象从模型空间转换为窗口坐标(例如640x480)。
我的问题是如何将这两者联系起来。如果我从PnP算法中获得一个相机矩阵,它似乎不适用于渲染流水线。它们如何联系起来?我如何正确地实现我的软件渲染器,使其也能与PnP算法中的不同相机矩阵一起工作?
我可以想象一件事情(但可能是一个丑陋的hack?),那就是将我提供给PnP算法的2D图像点从图像分辨率(例如[0, 640])缩放到[-1, 1],以“愚弄”算法给我标准化设备坐标,这可能会给我一个视图矩阵,渲染器可以使用。
虽然有一些博客文章/教程“如何将OpenCV solvePnP相机矩阵转换为OpenGL”之类的,但它们并没有真正帮助我理解问题的核心,即这两个东西如何联系以及如何正确实现这样的场景,当我有一个来自像cv::solvePnP(在这种情况下来自OpenCV)的算法的相机矩阵直接从世界到图像坐标变换时,我想将该矩阵“馈送”到我的软件渲染器,该渲染器具有不同的,“计算机图形学启发式”的管道。
或者也许我在第一段描述的软件渲染方法是“错误的”(意思是不优化)?