图形渲染流水线如何与相机矩阵估计算法相关联?

3
当构建计算机图形渲染器(例如传统的软件渲染器)时,常常使用模型矩阵、视图矩阵和投影矩阵。模型通过模型矩阵转换到世界空间,然后通过视图矩阵将所有内容转换到相机空间,之后进行投影到归一化设备坐标。通常会根据视锥体对三角形进行裁剪,并在必要时拆分三角形。然后将所有可见的三角形投影到屏幕空间并绘制。(例如 Shirley 的《计算机图形学基础》)。
另一方面,在讨论从点对应中估计相机姿态的计算机图形学中,透视-n-点问题(PnP,例如http://cvlab.epfl.ch/software/EPnP),这些算法直接估计一个相机矩阵,该矩阵将对象从模型空间转换为窗口坐标(例如640x480)。
我的问题是如何将这两者联系起来。如果我从PnP算法中获得一个相机矩阵,它似乎不适用于渲染流水线。它们如何联系起来?我如何正确地实现我的软件渲染器,使其也能与PnP算法中的不同相机矩阵一起工作?

我可以想象一件事情(但可能是一个丑陋的hack?),那就是将我提供给PnP算法的2D图像点从图像分辨率(例如[0, 640])缩放到[-1, 1],以“愚弄”算法给我标准化设备坐标,这可能会给我一个视图矩阵,渲染器可以使用。

虽然有一些博客文章/教程“如何将OpenCV solvePnP相机矩阵转换为OpenGL”之类的,但它们并没有真正帮助我理解问题的核心,即这两个东西如何联系以及如何正确实现这样的场景,当我有一个来自像cv::solvePnP(在这种情况下来自OpenCV)的算法的相机矩阵直接从世界到图像坐标变换时,我想将该矩阵“馈送”到我的软件渲染器,该渲染器具有不同的,“计算机图形学启发式”的管道。

或者也许我在第一段描述的软件渲染方法是“错误的”(意思是不优化)?

3个回答

2
通常在计算机图形学中,有以下4x4矩阵变换:模型到世界、世界到视图、视图到屏幕。后者有时被称为投影矩阵,屏幕坐标通常在[-1,1]范围内进行归一化。
通常在计算机视觉中,“投影矩阵”是一个模型到图像矩阵(通常为3x4)的映射,将3D世界空间映射到2D图像空间,其中后者在[0,width)x [0,height)范围内未经归一化。
你应该注意到的一件事是,如果按正确顺序将计算机图形学矩阵相乘,你将得到一个从模型坐标到规范化屏幕空间的4x4矩阵。如果将其与另一个从规范化屏幕坐标缩放和平移的矩阵组合,你将得到与计算机视觉投影矩阵匹配的东西。(忽略4x4与3x4的差异。)
屏幕到图像 * 视图到屏幕 * 世界到视图 * 模型到世界 = 模型到图像
(我假设矩阵左乘列向量,y = Ax。有时在图形学中使用相反的约定,但最好避免。您需要检查您的约定,如有必要,请转置矩阵以在整个过程中使用相同的约定。)
计算机视觉的做法通常更加数学上方便。但是如果您想为图形管道创建单独的矩阵,则可以执行以下操作:
将模型到世界变换设置为单位。提取投影矩阵的刚性部分,即相机旋转和平移,并将其设置为您的视图矩阵(世界到相机)。将其余部分设置为投影矩阵,考虑到规范化屏幕空间。
如果需要详细信息,请参阅Hartley和Zisserman的《计算机视觉中的多视角几何》第2版第6章。
在某些情况下,更简单的替代方法是仅保留除视图到屏幕矩阵以外的所有内容。然后将世界到图像矩阵乘以一个图像到规范化屏幕的变换。所得的世界到规范化屏幕变换可用作图形管道中的投影矩阵。
即:视图到屏幕:= 图像到屏幕 * 模型到图像

我想给你悬赏,你的回答非常有帮助。那24小时的时间太短了。我会按照你的建议尝试,并在有任何后续问题时回来。非常感谢!如果有管理员能给你悬赏,请这样做。 - Ela782

1

视图矩阵应该是相机矩阵的逆矩阵。

直觉上来说:如果相机向左移动1个单位,视图矩阵需要将场景中的其余部分向右移动1个单位。


好的,那并没有解决我上面提到的问题/疑问。PnP算法返回的相机矩阵直接从模型空间转换到屏幕空间,而在渲染管线中,视图矩阵(渲染器相机矩阵在世界空间中的逆矩阵)基本上是不同的。 - Ela782
@Ela782:然后乘以投影矩阵的逆矩阵,得到只有视图组件。 - Sorin

1

你的“丑陋黑客”实际上是正确的步骤。

相机估计过程(例如PnP)基于对由具有明确定义的传感器分辨率的真实设备产生的真实图像执行的测量。因此,用像素坐标表达其输出是合适的,因为这是模型及其预测误差自然表达的空间。即使是双射的任何其他表示都将是掩盖实际测量的几何量的花招。

但是,一旦您估计了相机姿态和投影模型(即将3D点转换为像素的函数),您可以自由地将其重新映射到您喜欢的任何坐标空间,包括您指示的规范化设备坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接