4.1 3D坐标变换补充
(1)正交矩阵的定义:矩阵的转置 === 矩阵的逆
绕XYZ轴旋转时的旋转矩阵的写法。
绕Y轴旋转的特殊情况理解:x叉乘y得z正方向、yz-x正方向 、zx - y为负数?
(2)任何的旋转变换都可以分解成xyz变换的组合:飞机可以前后左右与自身的旋转。
上下即俯仰角,左右即偏航角、自身旋转即滚转。
(3)在图形学里,有人(罗德里格斯)根据旋转分解到xyz轴,发明了这样一个矩阵,可以将任意的旋转写成这样一个公式。
I:单位矩阵
旋转角:a
旋转轴:向量n(过原点的向量)
如果想绕不是原点的轴,先移动到原点轴 再平移回去。
右侧矩阵:向量叉乘向量 = 把向量变成矩阵 * 向量,这个矩阵叫做向量的dual matrix
(4)四元数:二维旋转15度,可以写出一个公式;二维旋转25度,也可以写出一个公式。想要这两个变换的插值,并不是简单的20度,所以引出四元数。
4.2 View Transformation / Camera Transformation 视图变换
(1)目的:将三维空间转二维空间
(2)MVP变换步骤:Model View Projection
· M模型变换:找到合适的位置,安排好拍照的对象
· V视图变换(相机变换):找到相机合适的位置与角度(相机朝向)
· P投影变换:拍照cheese!
(3)视图变换/相机变换
确定相机的位置position、朝向look-at、向上方向look-up(相机自身的旋转角,通过定义相机的向上方向),移动相机的位置到标准的位置。
约定俗成:相机的位置在原点,朝向-Z,向上方向是Y轴。
如何将任意相机调整到标准位置?三部曲
总的来说:平移+旋转
1)平移:把相机坐标(xe,ye,ze)平移到坐标原点(0,0,0)
2)旋转:调整“相机朝向g”到-Z轴
3)旋转:调整“相机的向上方向t”到Y轴
4)旋转:调整 " g * t " 方向到X
因为从任意方向旋转到单位方向上,较为复杂。故,求视图矩阵的逆矩阵。
又因为正交矩阵R的转置矩阵RT===逆矩阵R-1,所以对逆矩阵进行转置得原矩阵。
4.3 Projection Transformation 投影变换(正交投影、透视投影)
1、正交投影 Orthographic
经过模型视图变换后,相机已经在原点,朝向-Z,向上方向为Y。令Z=0即可。
暂无法区分前后。
将任意物体(左右X、上下Y、远近Z)平移旋转到原点,将XYZ轴旋转缩放到【-1,1】区间。
2、透视投影 Perspective
(1)透视投影可以想像成是远平面的四个点与中心点先定住,挤(收缩)到近平面。
再做正交投影变换。
(2)如何找到远平面的某一点(x y z 1)收缩到近平面的点的位置的比例关系呢?
(其实是得到了一个变换矩阵,将远平面->近平面)
远平面的x,y,缩放的比例是n / z。得到缩放后的坐标点,再同时乘以z得到右式。
即从原来的远平面的任意(x y z 1)变换到近平面(nx ny still no z),只需进行矩阵变换。
这个矩阵是推出来的,x->nx,则第一行是(n 0 0 0),以此类推得到下面矩阵。
目标矩阵:
需要乘以中间变换的矩阵:
(3)变换矩阵中还有一行(? ? ? ?)未推出。应该遵循以下原则:
1)任何在近平面的点(x y n 1)经过变换矩阵后不应该改变。(即下图,再同乘以n)
第三行与近平面点的结果是n^2,与x y无关,所以第三行前两个数是00。
而n2可能是A=n、B=0得到,也可能是A=0、B=n2得到。因此还需要第二个原则。
2)任何在远平面的点的Z值不应该改变。
远平面的中心点(x=0 y=0 z=f 1)
(4)至此,得到第三行矩阵的值。即完整矩阵的值。即完成从透视投影转到正交投影。