模型视图投影矩阵的目的是什么?

120

我们使用模型视图投影矩阵的目的是什么? 为什么着色器需要模型视图投影矩阵?


14
请查看这个链接:http://www.songho.ca/opengl/gl_transform.html - iKushal
4
我建议开设一个专门针对计算机图形学的Stack Exchange网站,并选择这个问题作为[示例问题](http://area51.stackexchange.com/proposals/62667/computer-graphics/62670#62670)。如果你有兴趣看到该网站推出,请关注[computergraphics.stackexchange.com](http://area51.stackexchange.com/proposals/62667/computer-graphics)。 - wip
1
http://www.codinglabs.net/article_world_view_projection_matrix.aspx - Björn Hallström
2个回答

218

模型、视图和投影矩阵是三个独立的矩阵。模型将对象从本地坐标空间映射到世界空间,视图从世界空间到摄像机空间,投影从摄像机到屏幕。

如果你将它们组合起来,就可以使用一个结果将所有东西从对象空间映射到屏幕空间,这样你就能够确定需要传递给下一阶段可编程管道的内容了。

在旧的固定功能管道中,你会将模型和视图应用在一起,然后使用另一个由它们派生的结果(使用一些修复措施,例如即使对对象应用了缩放,法线也仍然具有单位长度)来计算光照,最后应用投影。你可以在OpenGL中看到这一点,因为它从不将模型和视图矩阵分离 —— 它们保持为单个modelview矩阵堆栈。因此,有时候也会在着色器中看到这一点。

因此:合成的模型视图投影矩阵通常被着色器用来将每个模型加载的顶点映射到屏幕上。这并非必需,有许多实现相同效果的方法,它只是因为它允许所有可能的线性变换而变成了通常使用。由于这个原因,它在过去的固定管道世界中也是标准。


3
所以对于几个对象(网格),我们需要几个 modelView 矩阵,不是吗? - Yuriy Vikulov
6
假设它们可以独立移动或已被单独放置,那么是的。因此,这是最常见的操作方式——将modelView或projectionModelView作为统一变量传递到着色器程序中,并在CPU上为当前模型设置它。 - Tommy
嗨Tommy,您能否为我推荐一些使用模型视图投影矩阵,在Android上实现Opengl Es2.0中Pan功能的示例代码呢?我参考了更多的链接,但没能得到清晰的想法。如果有示例代码,我会更容易理解的。 - harikrishnan
1
我有一个问题。如果openGL使用MV矩阵,如果我们想要从相机空间转换到世界空间,我们需要inverse(projection matrix*view matrix) * (cursor position)但是如果模型视图是一个组合矩阵。如何分离模型和视图矩阵,以便我可以在计算中使用视图矩阵。所以我需要将它们分开吗? - Evren Bingøl
@EvrenBingøl 你得到答案了吗?我保持我的模型和视图矩阵分开,但我想知道你的问题的实际答案,如果我应该继续让它们分开还是不分开。 - tom_mai78101

10
因为矩阵很方便。矩阵帮助将有关不同空间的位置和方向进行转换(一个空间可以由3个垂直的轴和一个原点定义)。
以下是@legends2k在评论中指定的书中的示例。
Cartesia市居民使用一张地图来描述他们的城市,该地图的原点合理地位于市中心,坐标轴沿着罗盘的正北、正东、正南和正西方向。Dyslexia市居民使用一张地图来描述他们的城市,其坐标中心位于任意点,并且坐标轴沿某些任意的方向延伸(可能在当时看起来是个好主意)。两个城市的居民都非常满意各自的地图,但州交通工程师被分配了一个任务,即制定一份显示两个城市详细信息的地图,这引入了第三个坐标系,对他而言是优越的,但并不一定对其他人也是如此。
以下是另一个例子。
假设您在游戏中创建了一个汽车对象,并使用世界坐标设置其顶点位置。假设您需要在完全不同的世界中在另一个游戏中使用此汽车,则必须重新定义位置,计算将变得复杂。这是因为您必须再次计算与新世界相关的窗口、引擎盖、前灯、轮子等汽车部件的位置。

请观看this视频以了解模型、视图和投影的概念。(强烈推荐)

然后,请观看this以了解世界中的顶点如何表示为矩阵以及它们如何进行变换。


如果你深入思考,你会意识到,即使变换是基于一个对象的起点(即单个点),对象的所有顶点(网格/模型)都将经历变换,即所有1000个顶点都将乘以模型矩阵。因此,你的观点不太正确。模型矩阵只是将模型空间中的顶点转换为世界空间的矩阵。这里没有性能优势,只是方便而已。 - legends2k
如果是这样,为什么不在一个单一的三维空间中表示每个点呢?当您将场景的输出用作另一个场景的输入时,应该会有好处,这可能是另一个可移动场景的输入 :) - cegprakash
1
它们不在单一空间中表示所有顶点,因为使用相对空间比使用更大的空间(如世界)更方便。例如,当命令机器人向前移动2米时,相对于其眼睛进行操作比定位世界中心,然后计算正确的结果坐标更为合适。 - legends2k
我认为你是正确的。无论如何,在复杂网格的情况下,每个像素都将调用片段着色器,并且我们将为每个像素执行矩阵乘法。 :| - cegprakash
明白了。不过,对于每个顶点的位置,MVP都要乘以它,而对于每个像素中的每个法线,都要乘以transpose(inverse(MV))! - cegprakash
修改了我的回答 :) 谢谢 @legends2k - cegprakash

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