矩阵MVP变换

三维矩阵变换

根据之前理解的二维矩阵变换,简单做下三维矩阵变换的总结。

三维缩放

矩阵MVP变换_第1张图片
sx、sy、sz分别代表三个轴向的缩放。

三维平移

矩阵MVP变换_第2张图片
tx、ty、tz分别代表三个轴向的平移量。

三维旋转

矩阵MVP变换_第3张图片
推导思路是 通过矩阵乘法的规律,保持一个轴向不变的同时,对其它两个轴向进行二维旋转。
矩阵MVP变换_第4张图片

注意到y轴上的旋转矩阵不一样,看起来像是绕y轴旋转- α \alpha α,而绕其它轴旋转是旋转 α \alpha α一样。其实这里的区别只是看y轴的朝向,我们知道第三个轴往往是通过叉乘得到的,如果这里是通过x×z得到y,那么就是 α \alpha α,而在这里,由上图可以看出,y轴是通过z×x得到的,因此是反的。

罗德里格斯旋转公式:

矩阵MVP变换_第5张图片
以上是绕n向量旋转 α \alpha α角度的通用公式。

MVP(模型视图投影)变换

通过一个照相的例子来理解MVP是什么:
矩阵MVP变换_第6张图片
第一步:人们找一个合适的位置准备拍照(model模型变换)
第二布:相机摆一个合适的位置和角度(view视图变换)
第三步:茄子~拍下照片(projection投影变换)

1.视图变换

根据以上理解我们知道,视图变换指的是相机的变换。
而相机不在原点时,我们针对相机相对与物体的位置,是不方便确定的。
于是我们想通过物体的相对运动,将相机的位置移动至坐标系的原点,且物体保持与相机的相对位置不变,同时进行变换。
矩阵MVP变换_第7张图片

那么如何能让相机回到原点呢?
我们先观察一个相机的视角是由哪些因素控制的:
矩阵MVP变换_第8张图片
可以观察到相机的视角受三个因素影响:
1.相机位置posiiton
位置影响和物体的相对位置。
2.相机朝向look-at direction
相机朝向影响相机的正方向,决定能拍到什么。
3.相机上方向
上方向决定相机的旋转,决定拍到的照片是正的还是歪的。
我们最终想要得到的相机应该是位置位于原点,朝向-Z轴,上方向为Y轴的一个相机。
相机变换过程
由先前学过的二维转换过程得知,我们应该先进行平移变换,再进行旋转变换,这样才能得到我们想要的结果。
平移矩阵**Tview**我们可以很简单的得到:
矩阵MVP变换_第9张图片
而旋转矩阵我们可以通过旋转矩阵的性质,巧妙的得到:
矩阵MVP变换_第10张图片
g 代表相机朝向, t 代表相机的上方向, g × t 代表相机最后一轴。
如果我们按照原来的思路,把 g 旋转至- Zt 旋转至 Y ,是不是需要至少两次三维旋转变换,才能得到最终结果 Rview
但是我们反过来想,将 Z = (0,0,1,0)T旋转至 -g ,将 Y = (0,1,0,0)T旋转至 t ,只需要通过上图中 R-1view 简单得到。且根据旋转矩阵是正交矩阵的性质:正交矩阵的逆等于正交矩阵的转置。就能简单的得到 Rview
得到 TviewRview 后,我们就可以确定视图变换矩阵 Mview
在这里插入图片描述

2.投影变换

投影变换分为透视投影和正交投影,透视投影就是我们日常生活中感受到的投影,所以应用透视投影往往会更真实,而透视投影和正交投影最大的区别在于正交投影没有透视投影拥有的“进大远小”的特点。

正交投影

正交变换的过程是先把物体的中心点移动至原点,然后进行缩放,让物体变成一个边长为2的立方体的形状。
矩阵MVP变换_第11张图片
假设一个长方体如下:
矩阵MVP变换_第12张图片
那么对它进行操作的正交矩阵为 Mortho
矩阵MVP变换_第13张图片

透视投影

先来看透视投影和正交投影的区别图:
矩阵MVP变换_第14张图片
左边是透视投影的视图,右边是正交投影的视图。区别只是透视投影的 f 屏幕比 n 平面要大。因此我们得出一个思路,先把远平面 f 挤压成和近平面 n 一样的大小,然后直接进行我们刚刚得出的正交投影过程,就可以直接得到透视投影矩阵了。
这个挤压的过程我们定义三个要求:
1.近平面 n 永远不变
2.远平面 fZ轴不变;
3.挤压后 f中心点不变
满足以上三个要求,我们得到的透视投影转换为正交投影的矩阵 Mpersp->ortho 就唯一了。

下面来看如何得到 Mpersp->ortho
根据相似三角形的性质:
矩阵MVP变换_第15张图片
我们可以得到缩放的比例:
矩阵MVP变换_第16张图片
根据这个比例我们可以写出中间任意点的挤压后的位置为:
矩阵MVP变换_第17张图片
这里使用到一个性质:齐次坐标中,所有元素都乘以一个相同的数,表示的点一样
那么我们要求的矩阵就应该满足:
矩阵MVP变换_第18张图片
由上式可得:
矩阵MVP变换_第19张图片
如何得到的我们以第一行为例,为什么是(n,0,0,0),因为结果点的第一行为 nx ,只与x有关,而向量第一行是矩阵的第一行乘以点的第一列得到的,因此除 x 外其它只能乘以 0 ,结果就是(n,0,0,0)。其它行同理。
接着我们利用我们刚刚定义的要求:
矩阵MVP变换_第20张图片
近平面和远平面的Z轴都不发生改变,我们可以尝试去求矩阵的第三行。
我们可以根据这个性质得到挤压后的点为:(nx,ny,z2,z)T
由此可以推出第三行的内容的前两位一定为0,但是我们无法确定第三位和第四位,因为它可能是z和0,或者0,z2又或者其它更复杂。
我们知道第三行是(0,0,A,B)T这样的形式了,我们可以把 n 平面 和 f 平面带入进去得到一个二元一次方程组解出A,B:
矩阵MVP变换_第21张图片
得出解A,B:
矩阵MVP变换_第22张图片
得到最终的透视投影的矩阵Mpersp = MorthoMpersp->ortho
(Mortho为正交矩阵,Mpersp->ortho为上面所求矩阵)

你可能感兴趣的:(图形学基础学习札记,矩阵,线性代数)