补充上节的一个内容:在旋转中,旋转的矩阵的它的逆矩阵就是它的转置。下面会应用。
在数学上,若一个矩阵它的转置等于它的逆,则称这个矩阵为正交矩阵。
进入今天的内容:
1、3D变换
在上节内容中有相关的内容和解释,与2D变换内容整合在了一起。
缩放和变换的矩阵式子如上。
三维空间中最复杂的式子就是旋转了,先从简单的例子说起,假设物体绕的x,y,z轴旋转,其式子如下,已写出:
绕x轴旋转时,点坐标中x值其实是不变的,所以上面的x相关的值应该不变,相关x轴的值就是左上角中3*3的矩阵中的第一行和第一列。而中间的2*2的矩阵其实就是y轴和z轴进行角度的旋转。
绕z轴旋转也是如此的思想,z轴的不变,x轴和y轴进行角度的旋转。
绕y轴的旋转是较为难以理解的,根据右手定则可知(在上一节的内容中)是 ×
=
轴,不是相反的,所以,在这里式子有些难理解。(老师只讲到了这,还是有些不懂,但是右手定则是明白的)
但上述所讲的只是旋转中好理解的一部分,其实在大部分实例中,更多的是不规则的x,y,z轴的旋转,换个角度思考:依旧是有三条轴,但是x,y,z轴都进行了不同角度的旋转,从而最终达到旋转的结果。在这时,我们就将引入一个旋转公式,罗德里格斯旋转公式:
在这个旋转矩阵中,定义了一个旋转轴n,旋转角度 。默认为n轴过原点的。
当要所绕旋转的点不是原点时,就先将移动轴,使其旋转的点到原点上。在进行旋转后,再将原点移回本来的地方,所以上述中所说的默认n轴过原点也是不会影响结果的。
2、视图变换(Viewing transformation)
简称MVP变换:模型、观测、投影变换
2.1、观测变换(View transformation)
观测变换:将3D中的物体变为了一张2D的图片。
由于物体和相机可以做相对运动,所以,为了简便后来的工作。约定俗成:将相机挪动后放在以y轴的方向上,将相机的中心挪动后永远放在原点(0,0,0),相机挪动后永远向 -Z 方向看。如下图:
举个例子,如下图:
题目如
图,相机中心原本在
,朝着
看,并且上方向是
,现在要变为,中心在原点,朝着 -Z 方向看。一一对应,在上图的下面一部分有步骤。(为了更好的理解,可以借助坐标轴旁边的类似沙漏型的图来理解旋转,虽然不是很形象,但是可以看出明显的旋转变换,毕竟是三维的物体,多借助想象)。
上图就是在数学中的部分了,是需要求的矩阵,该矩阵首先是进行矩阵
的变换,也就是平移变换,上面所说的移动原点;接下来再进行矩阵
的变换,也就是旋转变换。(从右至左!)
然后,矩阵已经写出,比较好写;难的是矩阵
,由于从
到-Z、
到Y、(g×t)到X的变换难表示,但是反过来其实会好表示,也就是写从X到(g×t),以此类推的好表示,也就是矩阵
,矩阵
的逆矩阵。再将它逆回去,本节开始之前就说你矩阵等于它的转置矩阵,所以可以从图中所得矩阵
。
向上方向:可以想象下,在相机上插一根草,它会随着相机的旋转变换,而它所指的方向也就是向上方向。
2.2、投影变换(Projection transformation)
透视投影(左):近大远小
正交投影(右):一样大
2.2.1、正交投影(op)
如图中的坐标轴,对于物体和坐标轴的摆放方式就是上面内容说过的。摆放好后,拿走Z轴,就是正交投影的一个很形象的表现。
接下来是正式的做法:
将统一映射在(-1,1)的立方体中也是一个约定俗成的,为了让后面的计算更简单。(先平移后缩放)
(f,n)在Z轴上,代表着远近;(b,t)代表着上下,在Y轴上; (l,r)代表着左右,在X轴上
在下图中,矩阵公式中,从右至左,先平移至原点,再缩放到(-1,1)的立方体。
2.2.2、透视投影(PP)
应用最广泛,近大远小的性质,视觉效果就是平行线不再平行,更接近于眼睛的效果。
下图中需要做的是:将Frustum中的f面“挤”成Cuboid的f面,其实就是将透视投影变为正交投影,求其矩阵变换
如何“挤”就是一个难点,总结为:找特殊(点)倒推!求出矩阵变换
可以用相似三角形的思想,如下图
其中, =
,即可得上式,便可以以此类推得到x相关的式子。
如下图:在齐次坐标中,在将其乘以z
在上图中的最右下方的那个矩阵就是结果,现在就可以进行反推,得矩阵变换,如下图:
接下来,在Frustum、Cuboid的图中n面为近的平面,并且在f面上的点到n面的距离,无论在“挤”前还是“挤”后都不变,如下图:(x,y,n,1)在n上的点,和在远的平面上点距离都不变
运用上面的规律,可得下图:
在上述的最上面一行式子中,最左边是通用的公式,而到了右边,将这个式子放在上述所说的特殊规律中,距离不变。而靠下的式子中,(0,0,A,B)是求得的的第三行。(上述规律可得与x,y无关,所以推出了(0,0))
第二个特殊点:f面的中心点,在“挤”前“挤”后,也不变,则可得下图:f指的的中心点
为何要将f变换,取决于最开始得到的结果中,列坐标的最后一个值为z,同上述n->
而通过上面所说的n,f面的上的点距离不变可得下图:
结合两式,解可得
就可得出!
接下来如图:得到了,做了相关变换以后,还要再做正交的矩阵变换
就可得其透视的矩阵变换