当前位置: 首页 > 知识库问答 >
问题:

如何将图形渲染管道与摄像机矩阵估计算法联系起来?

葛航
2023-03-14

在构建计算机图形渲染器(例如,传统的软件渲染器)时,人们经常使用模型、视图和投影矩阵。模型矩阵将模型转换到世界空间,视图矩阵将所有物体转换到摄像机空间,然后投影到归一化的设备坐标。通常情况下,对视锥面进行一些剪裁,如果需要,三角形会被拆分。然后将所有可见的三角形投影到屏幕空间并绘制。(如雪莉的《计算机图形学基础》)。

另一方面,在计算机图形学中,当讨论由点对应估计摄像机姿态时,即透视N点问题(PnP,如http://cvlab.epfl.ch/software/epnp),这些算法直接估计将物体从模型空间转换到窗口坐标(如640x480)的摄像机矩阵。

我现在的问题是这两者是如何联系在一起的。如果我从PnP算法中得到一个相机矩阵,它似乎不适合渲染管道。它们是怎么绑在一起的?我如何正确地实现我的软件渲染器也与那些不同的相机矩阵从PnP算法工作?

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

虽然有一些博客文章/教程“如何将OpenCV solvePnP camera matrix转换为OpenGL”之类的,但它们并不能真正帮助我理解问题的核心,这两件事是如何联系在一起的,以及当我有一个从CV::solvePnP(在这种情况下是从OpenCV)这样的算法直接从世界转换到图像库的camera matrix时,如何正确地实现这样的场景,我想将该矩阵“传送”到我的软件渲染器,该软件渲染器有一个不同的“计算机图形启发”管道。

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

共有1个答案

邓德本
2023-03-14

在计算机图形学中,通常有以下4x4矩阵转换:模型到世界,世界到视图,视图到屏幕。后者有时被称为投影矩阵,屏幕坐标通常归一化为[-1,1]。

通常在计算机视觉中,“投影矩阵”是一个模型到图像的矩阵(通常是3x4),它从3D世界空间映射到2D图像空间,后者在[0,width)x[0,height)中是非规范化的。

你应该注意的一件事是,如果你把你的计算机图形矩阵,并以正确的顺序将它们相乘,你将有一个4x4矩阵,从模型线映射到规范化的屏幕空间。如果你用另一个矩阵来组成它,该矩阵从标准化的屏幕库到图像库进行缩放和翻译,你就会得到与html" target="_blank">计算机视觉投影矩阵匹配的东西。(忽略4x4与3x4的差异。)

(这里我假设矩阵乘以左边的列向量,y=ax。有时在图形中使用相反的约定,但最好避免。您需要检查您的约定,如果有必要,将矩阵转置以始终使用相同的约定。)

计算机视觉做事情的方式往往在数学上更方便。但是,如果要为图形管道创建单独的矩阵,可以执行以下操作:

将模型到世界的转换设置为身份。提取投影矩阵的刚性部分,即摄像机的旋转和平移,并将其设置为您的视图矩阵(世界到摄像机)。将变换的剩余部分设置为投影矩阵,同时考虑到归一化的屏幕空间。

在某些情况下,一个更简单的替代方案是只保留视图到屏幕矩阵以外的所有内容作为标识。然后将世界到图像的矩阵乘以图像到归一化屏幕的变换。由此得到的世界到归一化屏幕的变换可以用作图形流水线中的投影矩阵。

即视图到屏幕:=图像到屏幕*模型到图像

 类似资料:
  • 我一直在学习相机标定,并在理解如何从相机投影矩阵中恢复相机的外在和内在参数时感到困惑。 一般来说,我们可以通过求解三维世界坐标与二维屏幕坐标对应的方程组来导出摄像机投影矩阵值,即得到一个矩阵,比方说“C” 通常,在不失去一般性的情况下,我们可以分配c34=1,我们可以通过3D-2D对应关系找到其余的元素。 然后,我们可以将摄像机投影矩阵C与ext和int矩阵(比方说M)的合取进行比较,该合取可以被

  • 我想用jqmath编写表(矩阵),但输出不正确 我复制jqmath示例 这是我的代码: 输出是如下所示的线性矩阵: 我建议在"var s = '$( \表\cos θ, - \sinθ;\sinθ,\cosθ)"中结合斜杠和t(\t)会导致这个问题,因为t字符不见了,第一行向右移动。 我怎样才能解决这个问题? 解决了如果我用4个斜杠替换每个斜杠,结果是正确的。。。。

  • 我有一个矩阵。只有唯一的颜色以不同的权重重复它们自己。从它们中,我得选择一半,另一半必须用从第一个中最接近的元素替换。 我想到了在图像中循环,并搜索最近的颜色为当前的一个。找到后,我把一个换成另一个。 但我有3个循环、、。前两个I循环通过RGB矩阵,第三个用于循环到包含最终颜色的矩阵。这需要一些时间来计算。 可以做些什么来加快它的速度? 循环如下所示: 表示选择为最终颜色的半色。 我可以考虑一些小

  • 摄像机 通过在三维空间中布置和移动游戏对象来创建 Unity 场景。而观察者的屏幕是二维的,因此需要通过某种方式来来捕获视图,并使之平面化,才能显示在屏幕上。这个过程通过 摄像机 Camera 完成。 摄像机是一个游戏对象,定义了场景空间的观察视图。它的位置定义了观察点,它的向前轴(Z)和向上轴(Y)分别定义了观察方向和屏幕的垂直方向。摄像机组件 Camera 还定义了视椎体(落入观察视图的区域)

  • 我试图从opengl FrameBuffer中保存的深度数据渲染三维点云。基本上,我从不同的n个视点(已经知道)对以(0,0,0)为中心的渲染模型取了不同的深度样本。我成功地保存了深度图,但现在我想从这些深度图中提取x,y,z。为此,我从图像向世界反投影点。为了得到世界坐标,我使用以下方程P=K_inv[Rt]_inv*P。来计算世界坐标。 为了计算图像的本质矩阵,我使用了来自opengl相机矩阵