根据之前理解的二维矩阵变换,简单做下三维矩阵变换的总结。
推导思路是 通过矩阵乘法的规律,保持一个轴向不变的同时,对其它两个轴向进行二维旋转。
注意到y轴上的旋转矩阵不一样,看起来像是绕y轴旋转- α \alpha α,而绕其它轴旋转是旋转 α \alpha α一样。其实这里的区别只是看y轴的朝向,我们知道第三个轴往往是通过叉乘得到的,如果这里是通过x×z得到y,那么就是 α \alpha α,而在这里,由上图可以看出,y轴是通过z×x得到的,因此是反的。
通过一个照相的例子来理解MVP是什么:
第一步:人们找一个合适的位置准备拍照(model模型变换)
第二布:相机摆一个合适的位置和角度(view视图变换)
第三步:茄子~拍下照片(projection投影变换)
根据以上理解我们知道,视图变换指的是相机的变换。
而相机不在原点时,我们针对相机相对与物体的位置,是不方便确定的。
于是我们想通过物体的相对运动,将相机的位置移动至坐标系的原点,且物体保持与相机的相对位置不变,同时进行变换。
那么如何能让相机回到原点呢?
我们先观察一个相机的视角是由哪些因素控制的:
可以观察到相机的视角受三个因素影响:
1.相机位置posiiton
位置影响和物体的相对位置。
2.相机朝向look-at direction
相机朝向影响相机的正方向,决定能拍到什么。
3.相机上方向
上方向决定相机的旋转,决定拍到的照片是正的还是歪的。
我们最终想要得到的相机应该是位置位于原点,朝向-Z轴,上方向为Y轴的一个相机。
⭐相机变换过程
由先前学过的二维转换过程得知,我们应该先进行平移变换,再进行旋转变换,这样才能得到我们想要的结果。
平移矩阵**Tview**我们可以很简单的得到:
而旋转矩阵我们可以通过旋转矩阵的性质,巧妙的得到:
g 代表相机朝向, t 代表相机的上方向, g × t 代表相机最后一轴。
如果我们按照原来的思路,把 g 旋转至- Z 、 t 旋转至 Y ,是不是需要至少两次三维旋转变换,才能得到最终结果 Rview 。
但是我们反过来想,将 Z = (0,0,1,0)T旋转至 -g ,将 Y = (0,1,0,0)T旋转至 t ,只需要通过上图中 R-1view 简单得到。且根据旋转矩阵是正交矩阵的性质:正交矩阵的逆等于正交矩阵的转置。就能简单的得到 Rview。
得到 Tview 和 Rview 后,我们就可以确定视图变换矩阵 Mview :
投影变换分为透视投影和正交投影,透视投影就是我们日常生活中感受到的投影,所以应用透视投影往往会更真实,而透视投影和正交投影最大的区别在于正交投影没有透视投影拥有的“进大远小”的特点。
正交变换的过程是先把物体的中心点移动至原点,然后进行缩放,让物体变成一个边长为2的立方体的形状。
假设一个长方体如下:
那么对它进行操作的正交矩阵为 Mortho :
先来看透视投影和正交投影的区别图:
左边是透视投影的视图,右边是正交投影的视图。区别只是透视投影的 f 屏幕比 n 平面要大。因此我们得出一个思路,先把远平面 f 挤压成和近平面 n 一样的大小,然后直接进行我们刚刚得出的正交投影过程,就可以直接得到透视投影矩阵了。
这个挤压的过程我们定义三个要求:
1.近平面 n 永远不变;
2.远平面 f 的Z轴不变;
3.挤压后 f 的中心点不变。
满足以上三个要求,我们得到的透视投影转换为正交投影的矩阵 Mpersp->ortho 就唯一了。
下面来看如何得到 Mpersp->ortho :
根据相似三角形的性质:
我们可以得到缩放的比例:
根据这个比例我们可以写出中间任意点的挤压后的位置为:
这里使用到一个性质:齐次坐标中,所有元素都乘以一个相同的数,表示的点一样。
那么我们要求的矩阵就应该满足:
由上式可得:
如何得到的我们以第一行为例,为什么是(n,0,0,0),因为结果点的第一行为 nx ,只与x有关,而向量第一行是矩阵的第一行乘以点的第一列得到的,因此除 x 外其它只能乘以 0 ,结果就是(n,0,0,0)。其它行同理。
接着我们利用我们刚刚定义的要求:
近平面和远平面的Z轴都不发生改变,我们可以尝试去求矩阵的第三行。
我们可以根据这个性质得到挤压后的点为:(nx,ny,z2,z)T
由此可以推出第三行的内容的前两位一定为0,但是我们无法确定第三位和第四位,因为它可能是z和0,或者0,z2又或者其它更复杂。
我们知道第三行是(0,0,A,B)T这样的形式了,我们可以把 n 平面 和 f 平面带入进去得到一个二元一次方程组解出A,B:
得出解A,B:
得到最终的透视投影的矩阵Mpersp = MorthoMpersp->ortho
(Mortho为正交矩阵,Mpersp->ortho为上面所求矩阵)