【发布时间】:2011-04-05 10:49:04
【问题描述】:
我们使用模型视图投影矩阵的目的是什么? 为什么着色器需要模型视图投影矩阵?
【问题讨论】:
-
我建议打开一个专门用于计算机图形学的 Stack Exchange 站点,并选择了这个问题作为example question。如果您有兴趣看到该网站正在启动,请关注computergraphics.stackexchange.com!
我们使用模型视图投影矩阵的目的是什么? 为什么着色器需要模型视图投影矩阵?
【问题讨论】:
模型、视图和投影矩阵是三个独立的矩阵。模型从对象的局部坐标空间映射到世界空间,从世界空间到相机空间的视图,从相机到屏幕的投影。
如果您将这三个都组合起来,您可以使用一个结果来映射从对象空间到屏幕空间的所有路径,这样您就可以计算出需要从传入的可编程管道传递到下一阶段的内容顶点位置。
在旧的固定功能管道中,您将模型和视图一起应用,然后使用从它们派生的另一个结果来计算照明(进行了一些修复,例如,即使您应用了一些缩放,法线仍然是单位长度到对象),然后应用投影。您可以在 OpenGL 中看到这一点,它从不分离模型和视图矩阵——将它们保持为单个模型视图矩阵堆栈。因此,您有时也会在着色器中看到这一点。
所以:着色器经常使用组合模型视图投影矩阵将您为每个模型加载的顶点映射到屏幕。这不是必需的,有很多方法可以实现相同的目标,这很常见,因为它允许所有可能的线性变换。正因为如此,它的一个较少组合的版本也是你老固定管道世界的常态。
【讨论】:
因为矩阵很方便。矩阵有助于转换相对于不同空间的位置/方向(一个空间可以由 3 个垂直轴和一个原点定义)。
这是一个来自 cmets 中 @legends2k 指定的书中的示例。
笛卡尔的居民使用他们城市的地图和原点 相当明智地集中在城镇中心,轴线沿着 指南针的基点。 Dyslexia 的居民使用 他们城市的地图,坐标以任意点为中心 和轴在一些可能看起来的任意方向上运行 当时是个好主意。两个城市的市民都很开心 与他们各自的地图,但国家运输工程师 分配了一项任务,为第一条高速公路制定预算 Cartesia 和 Dyslexia 需要一张显示两个城市详细信息的地图, 因此引入了第三个坐标系 对他来说,但不一定对其他任何人。
这是另一个例子,
假设您在游戏中创建了一个汽车对象,其顶点位置使用世界坐标。假设您必须在完全不同的世界中的其他游戏中使用同一辆车,您必须再次定义位置,并且计算会变得复杂。这是因为您必须再次计算车窗、引擎盖、前照灯、车轮等相对于新世界的位置。
观看this 视频以了解模型、视图和投影的概念。 (强烈推荐)
然后查看this,了解世界中的顶点如何表示为矩阵以及它们是如何转换的。
【讨论】: