一、前言
本文章将着重讲解图形学中的MVP矩阵变换,更注重当前阶段的理解,而不是纵观全局,如果想纵观全局,网上有很多资料,也可以等我更新,不过在这里,我不会给大家一个宏观的概念,也不会去细扣渲染管线。适用于刚接触图形学的新手,(本校数媒专业上完前两周图形学的人)。这部分知识在GAMES101也有,我上学期已经看过了,所以对我来说是复习回顾,对各位来说是前瞻预习,想学好任何一门知识,刨根问到底的精神是必不可少的,图形学也是一样,值得一提的是,图形学发展至今,其中有许多定义都是人为规定的,大多是为了简化计算和理解,所以问到这个维度的时候,一般来说已经是问到底了,所以不必再深追究。本文对我来说也算是一个学习记录/复习回顾,有错误还请各位指出,我会虚心改正。
二、关于MVP变换
1.什么是MVP变换:
上了第二周的课程,相信大家已经回顾起了线性代数的基础矩阵运算,这里不带大家回顾了,因为很简单。同时第二周的课上老师也讲了二维的图形变换,那么MVP变换是在三维空间下的变换,也就是4个维度的矩阵(齐次坐标),它的目的是为了把3D场景投影成2D图像显示在显示器上,值得一提的是MVP变换并没有直接把场景投影在屏幕,而只是再为投影做准备,想要投影到屏幕上还需要后面的许多操作运算来完成。
2. MVP矩阵的构成:
MVP矩阵顾名思义,它是由M,V,P三个矩阵组够成的矩阵,其中M为模型矩阵,V为视图矩阵,P为投影矩阵。M矩阵用来将物体顶点在模型空间下的坐标转换为在世界空间下的坐标,V矩阵用来将物体顶点在世界空间下的坐标转换为视图空间下的坐标。P矩阵用来将物体顶点在视图空间的坐标转换为裁剪空间的坐标。M矩阵包括平移矩阵、旋转矩阵、缩放矩阵。V矩阵包括旋转矩阵,平移矩阵。P矩阵则包括正交投影矩阵和透视投影矩阵。
3. 各个空间的理解:
(1)模型空间:
模型空间是以模型某一点为原点建立坐标系而形成的空间,模型的个顶点最开始是以模型空间坐标系的坐标。
如图为Unity中的猴头模型,该坐标系是模型空间的坐标系
(2)世界空间:
世界空间顾名思义就是以世界原点为原点建立的坐标系。显然可以知道,这与模型空间是两套坐标系,那么此时计算时就要进行相对的计算很麻烦,所以用M矩阵把模型顶点坐标从模型空间都转到世界空间有利于简化后面的计算,这也就是为什么我们要进行模型变换。
(3)视图空间:
视图空间是以摄像机为原点建立坐标系的空间。我们最终想要的显示在屏幕上的结果是由摄像机决定的,所以世界空间显得不那么主要,而转到以摄像机为原点的视图空间有利于我们计算投影到屏幕上的图像,这就是为什么要用V矩阵把世界空间下的顶点坐标转到视图空间的原因。
(4)裁剪空间:
人的视野是有限的,摄像机也是一样,在计算机中,摄像机的视野范围被一个叫视锥的东西决定着,它决定了我们能看到的范围,在视锥外,因为视野受限我们看不到任何东西。而看到的大小都落在视锥内。
视锥图示
三、各个矩阵的详细理解
模型矩阵:
我们先来确定一下我们的已知量:
模型空间坐标原点在世界空间的位置
模型空间坐标系在世界空间的旋转信息
模型空间坐标系在世界空间的缩放信息
有了这几个已知量,根据世界空间的相对位置,相对旋转和相对缩放信息,很容易得到模型变换的矩阵,也就是三个三维空间下的基础变换矩阵,从左至右依次为[平移]*[旋转]*[缩放]
这里只是个例子,实际缩放多少,旋转多少,以哪个轴旋转,平移多少视情况而定
视图矩阵:
我们同样确定一下已知量:
摄像机在世界空间的位置
摄像机的向上方向y (确保摄像机的摄像头不会歪)
摄像机的朝向-z (-z方向方便之后的计算)
这里的推导参照GAMES101的推导便于理解,我们想把物体从世界空间坐标系下转换到视图空间坐标系下,为了便于理解我们这样想,将世界空间下的坐标转换为视图空间下的坐标,可以逆向思考为把摄像机放到世界坐标原点,而物体随摄像机相对移动,那么最终呈现的结果是一样的,当然这里并不是真的把摄像机移动到世界坐标原点,而是相对的,如果真的做此操作,那么世界坐标原点也会随之相对移动。总之正向理解和反向理解虽然不同,但最终得出的V矩阵是相同的。那么按我们的反向理解,将摄像机通过平移旋转,来将视图空间的坐标系与被相对移动之前世界空间坐标系对齐即可。
不知道大家还是否记得,旋转矩阵是一个正交矩阵,所以正交矩阵的逆就是它的转置,所以如图:
最终得出V矩阵 :Mview = Rview*Tview (顺序不可调换)
投影矩阵:
投影矩阵分为正交投影矩阵和透视投影矩阵,先做透视投影,再做正交投影。
(1)透视投影和正交投影的区别:
左:透视投影 右:正交投影
简单的说,
透视投影符合我们人眼的视觉也就是近大远小,平行线远处相交(如看向远处的火车铁轨)
正交投影不改变大小,没有近大远小,且平行线永远平行。
(2)透视投影矩阵:
前面我们说了我们要先做透视投影矩阵再做正交投影矩阵,而透视投影矩阵实际上是把我们前面说的视锥,也就是四棱台压缩成正交投影中的长方体的样子的过程。这是一个相当复杂的变换过程,但有几点我们是可以根据经验直接确定的。
首先,规定近平面和远平面也就是上图所写的Near clip plane和Far clip plane。
然后,我们发现当进行压缩时,近平面的坐标是不变的,而远平面的中心点不变。
那么我们总体的过程就是先挤压远平面到和近平面相同的大小,再进行正交投影。
那么我们假设如上图规定近平面和远平面一点的坐标分别为(x',y',z',1)和(x,y,z,1)
图中有一些误解,这里我把摄像机到远平面的距离改为小写的 ' z ' ,到近平面的距离仍然为小写的n。
这个小写的z待会还会用f来替代(意为far,"远")。由此我们得出映射关系n/z或者说n/f。
那么再根据齐次坐标可知,我们都乘以z,那么坐标表示的在空间的位置是不变的,如上图。
到了这一步我们可以根据变换后的坐标写出该4X4矩阵的1,2,4行,那么只剩第三行没有解决如上图。
这里就需要用到我们前面提到的判断,我们虽然不知道常规点是怎么动的但是我们可以找特殊点,而特殊点一定符合规律,通过前面我们可知,近平面上的点不变,远平面的中心点不变。
那么先将近平面的点坐标带入我们刚才得到的未知量方程,得到如下图:
将我们的矩阵第三行未知量分别设为(0,0,A,B),因为n的平方和x,y没有关系。再根据近平面的点列方程可得如下图:(远平面同理,如下图第二个公式)
最终可得到关于A,B的两个方程,n,f分别为近平面到摄像机的距离和远平面到摄像机的距离为已知量。
两个方程,两个未知数,可解,可得:如下图:
再把AB带回原矩阵即可得到透视投影矩阵
(3)正交投影矩阵:
经过透视投影矩阵,我们的视锥体(棱台)已经被挤压成视景体(长方体)了,且内部并不均匀(形成了近大远小的效果),下一步,就是进行正交投影。
我们先把视景体捏成一个正则立方体也就是,三个轴的坐标都在[-1,1]范围内的立方体,并且将中心移到原点,这样方便之后的各种操作计算。过程如下图:
规定了各个面的坐标,那么缩放矩阵(使用2做归一化处理),平移矩阵都很好得出,如下图
而在视锥体中,由于f为远平面的中心点,该矩阵还可以简化为如下图:
(4)投影矩阵合体:
四、总结
那么到此,MVP矩阵就都详细给大家介绍一遍了,即使是这么复杂的变换过程,在计算机的渲染管线中,也不过是微乎其微的一步操作而已,而GPU的并行架构还会在同一时间处理场景内的上千万个物体的顶点。关于MVP变换我自己也死磕了很长时间,所以大家如果有不理解的地方也是正常的,我和ChatGpt对线了足足2个小时,才把每个过程的细节和原理真正的搞清楚,虽然不推荐大家和我一样的做法,但是确实能让思路通透不少,最后感谢观看,喜欢请点赞收藏,谢谢。