Opengl 模型视图投影矩阵的用途

Opengl 模型视图投影矩阵的用途,opengl,directx,3d,Opengl,Directx,3d,我们使用模型视图投影矩阵的目的是什么? 为什么着色器需要模型视图投影矩阵?模型、视图和投影矩阵是三个独立的矩阵。模型从对象的局部坐标空间映射到世界空间,视图从世界空间映射到摄影机空间,投影从摄影机映射到屏幕 如果将这三个元素组合在一起,则可以使用一个结果从对象空间映射到屏幕空间,从而能够计算出需要从传入顶点位置传递到可编程管道下一阶段的内容 在旧的固定功能管道中,您将同时应用模型和视图,然后使用从它们派生的另一个结果计算照明(使用一些固定,例如,法线仍然是单位长度,即使您对对象应用了一些缩放),

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

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

如果将这三个元素组合在一起,则可以使用一个结果从对象空间映射到屏幕空间,从而能够计算出需要从传入顶点位置传递到可编程管道下一阶段的内容

在旧的固定功能管道中,您将同时应用模型和视图,然后使用从它们派生的另一个结果计算照明(使用一些固定,例如,法线仍然是单位长度,即使您对对象应用了一些缩放),然后应用投影。您可以在OpenGL中看到这一点,OpenGL从不分离模型和视图矩阵,而是将它们作为单个modelview矩阵堆栈。因此,有时也会在着色器中看到这种情况


因此:合成模型视图投影矩阵通常由着色器用于从为每个模型加载的顶点映射到屏幕。这不是必需的,有很多方法可以实现同样的事情,这很常见,因为它允许所有可能的线性变换。正因为如此,在古老的固定管道世界中,它的一个不太复杂的版本也是规范。

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

下面是@legends2k在注释中指定的一本书的示例

笛卡尔西亚的居民使用他们城市的地图,上面写着他们的起源 非常明智地以城镇中心和轴线为中心 指南针的基点。诵读困难症患者使用 以任意点为中心坐标的城市地图 轴在一些任意的方向上运行,可能看起来 当时是个好主意。两个城市的市民都很高兴 有各自的地图,但州交通工程师 分配了一项任务,为两条公路之间的第一条公路编制预算 卡特尔西亚和诵读困难症需要一张地图,显示这两个城市的详细情况, 因此,它引入了第三个坐标系,该坐标系更优越 对他来说,虽然不一定对其他任何人

再举一个例子,

假设您在游戏中创建了一个汽车对象,其顶点位置使用世界坐标。假设你必须在另一个完全不同的世界中的其他游戏中使用同一辆车,你必须再次定义位置,计算将变得复杂。这是因为你必须再次计算车窗、发动机罩、前照灯、车轮等相对于新世界的位置

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


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

因此,对于多个对象(网格),我们需要多个modelView矩阵,不是吗?假设它们可能独立移动或单独定位,则是。因此,这是最常见的处理方法——将modelView或projectionModelView作为统一的着色器程序传递给着色器程序,在CPU上为当前模型进行设置。嗨,Tommy,如果可能的话,你能推荐Android中Opengl Es2.0中使用此模型视图投影矩阵的pan功能的任何示例代码吗。我参考了更多的链接,我不能得到任何清晰的想法。如果任何示例代码的意思是,这对我来说很容易理解..我有一个问题。如果openGL使用MV矩阵作为一个矩阵,如果我们从相机空间转到世界空间,我们需要反转(投影矩阵*视图矩阵)*(光标位置),但如果模型视图是一个组合矩阵。我们如何分离模型和视图矩阵,以便我可以使用视图矩阵进行计算。所以我需要把他们分开?@EvrenBingøl你得到答案了吗?我将模型矩阵和视图矩阵分开,但我想知道您的问题的实际答案,我是否应该继续将其分开。请查看此链接:我建议打开一个专门用于计算机图形的堆栈交换网站,并选择此问题作为答案。如果你有兴趣看到网站的发布,请关注!如果深入思考,您会发现,即使变换基于对象的原点(即单点),对象的所有顶点(网格/模型)都将经历变换,即所有1000个顶点都将乘以模型矩阵。因此,你的观点是不正确的。模型矩阵就是将模型空间中的顶点转换为世界空间的矩阵。这里没有性能优势,只是方便而已。如果是这样,为什么它们不在单个3D空间中表示每个点呢?当您将一个场景的输出用于另一个场景(可能是另一个可移动场景的输入)时,应该会有一些好处:)它们并不表示单个空间中的所有顶点,因为在相对空间中工作比在更大的空间(如世界)中工作更方便。比如说一个机器人,当被命令向前移动2米时,它的眼睛比定位世界中心,然后计算正确的坐标更适合它。我想你是对的。。无论如何,将为每个像素调用片段着色器,对于复杂网格,我们将为每个像素执行矩阵乘法:|在片段着色器中,仅完成照明/着色计算,当数据到达片段着色器时,所有位置计算都已完成(即,在顶点着色器中)。这本书是一个优秀的3D游戏数学资源。这个