The purpose of Model View Projection Matrix

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

102985 次浏览

模型矩阵、视图矩阵和投影矩阵是三个独立的矩阵。模型从物体的局部坐标空间映射到世界空间,从世界空间看到相机空间,从相机投影到屏幕。

如果您组合了所有三个,您可以使用一个结果来从对象空间映射到屏幕空间,从而能够计算出需要将哪些内容从传入的顶点位置传递到可编程管道的下一阶段。

在旧的固定功能管道中,你将模型和视图一起应用,然后使用从模型和视图得到的另一个结果来计算照明(通过一些修正,例如,即使你对对象应用了一些缩放,法线仍然是单位长度) ,然后应用投影。您可以在 OpenGL 中看到这一点,OpenGL 从不将模型矩阵和视图矩阵分开ーー将它们保持为单个模型视图矩阵堆栈。因此,你有时也会在着色器中看到这一点。

因此: 着色器经常使用组合模型视图投影矩阵来将你为每个模型加载的顶点映射到屏幕上。这不是必须的,有很多方法可以达到同样的效果,这很正常,因为它允许所有可能的线性变换。正因为如此,一个较小的组合版本也是在古老的固定管道世界的规范。

因为矩阵很方便。矩阵帮助转换不同空间的位置/方向(空间可以由3个垂直轴和一个原点定义)。

下面是@legends2k 在评论中指定的一本书中的一个例子。

The residents of Cartesia use a map of their city with the origin centered quite sensibly at the center of town and axes directed along 读写困难症患者使用的是 map of their city with the coordinates centered at an arbitrary point 以及沿着某些任意方向运行的轴 当时是个好主意。两个城市的市民都很高兴 他们各自的地图,但国家运输工程师 assigned a task of running up a budget for the first highway between 笛卡尔和诵读困难症需要一张地图显示这两个城市的详细情况, 这就引入了第三种坐标系 对他来说,虽然不一定对其他人来说。

这是另一个例子,

假设你已经在一个游戏中创建了一个汽车对象,它的顶点位置使用世界的坐标。假设你不得不在另一个完全不同的世界中使用同一辆车,你必须重新定义位置,计算会变得很复杂。这是因为你再次必须计算的位置窗口,引擎盖,大灯,车轮等,在汽车相对于新的世界。

See 这个 video to understand the concepts of model, view and projection. (highly recommended)

然后参见 这个,了解世界上的顶点是如何表示为矩阵的,以及它们是如何转换的。