games101_Viewing transformation
View/Camera transformation
视角转换
要将一个摄像机视角转换到原点坐标,需要经历以下步骤。
1.先将e平移到远点。
2.旋转g到 -Z。
3.旋转t到Y。
4.旋转 (g x t) 到 X。
数字表示
先进行平移变换。考虑到将g,t,(g x t)转换到-Z,Y,X变换困难,所以选择简单的方式。直接逆向思维,将变换过程反过来,也就是将-Z,Y,X转换为g,t,(g x t)。
直接写出上图中左下角第一个矩阵,将每一个向量作为矩阵的列向量(这是我们变换的最终目标),然后因为旋转矩阵是正交矩阵,所以图下方两个矩阵的关系应该为互逆矩阵,并且也是互为转置矩阵。可以由左边的矩阵推出右边的矩阵,这个矩阵也就是我们想 要求的矩阵。
Projection transformation
正交投影(上图左)并不会产生近大远小的效果,而透视投影(上图右)会,并且更趋近于我们人眼的观察方式。
透视投影我们认为摄像机是一个点,放射出一个锥体,从这个点观察物体。
正交投影无论近还是远观察到的物体都是完全一样的。
Orthographic projection
使长方体转变成一个规范的四方体。
一般来说是如下所示:
注意:因为games101课程本身采用的是右手坐标系,这里提到的 [f,n] ,指的是人眼观察的方向,我们一般定义看向 -Z 方向。所以单纯从z轴上的数值而言,距离近的数值是大于距离远的数值的。
先平移再进行缩放变换。
下图中的
- [-(r+l)/2] 等形式的方程意思是选取长方体中各个方向的中点,比如[r,l]方向代表的长方体左右中点,其他同理,并且该类方程取负号的原因是为了要进行平移,将长方体移到原点(x,y,z值要移动到原点就要相应移动-x,-y,-z值)。
- [2/(r-l)] 的意思是先1/(r-l)操作,缩放到单位1,然后再2*1/(r-l)操作放大至2。2的意思是(-1,+1)区间,要把不规则的方块扩大为边长为2。
- 这样的过程从长方体变成立方体,必然产生了拉伸,会变成标准立方体。这个过程称为(正则化、规范化、标准化)立方体。
Perspective Projection
(x,y,z,1)和(kx,ky,kz,k!=0)指的是同一个点。同一个点在齐次坐标的表现形式下会不一样。
怎么做透视投影
首先挤压平截头体,也就是一个平面到另一个平面的投影,再做正交投影,变换成长方体。
所谓挤压,就是将远平面f按照比例,挤压成近平面n的那种大小,远平面f上的点的坐标就会发生变化:
- 近平面永远不变,意思是即使平截头体被挤压后,近平面上的任何一个点始终不会变化。
- 挤压之后,z值也不会发生变化。
- 中心点不变,比如中心点为(0,0),挤压之后依旧是(0,0)。
- 其他的点向中心进行偏移,比如近平面是x和y在[-1,1]这个区间上的正方形 ,而远平面f为[-2,2]的正方形,那么远平面挤压过后,也要变为[-1,1]的正方形,那么远平面的点与原来的位置相比,就更靠近中心了。
怎样做透视投影?
- 首先将平截头体挤压成长方体(需要求矩阵:从透视投影到正交投影的变换矩阵)
- 上面结束后,再做一遍正交投影(正交投影的变换矩阵)
上图是挤压远平面的y的过程,根据相似三角形比可以得出图中右侧的公式。
坐标之间的关系:
z的变换还不知道,就先设为unknow。
M(persp->ortho)代表着“挤压变换”,(x,y,z,1)代表原始状态下远平面上的点,(nx , ny , unkown , z)代表挤压后远平面的点。于是,根据转换的这个式子就能够先写出矩阵的一部分信息:将下面的矩阵与向量(x,y,z,1)点乘,就能得到向量(nx,ny,unknow,z),根据此方法可以推出矩阵最后一行:
接下来就是要求矩阵第三行的值。第三行的值是有关于z的变换的关系,如果能找到z和 z’ 之间的关系,就能够写出第三行的数值,由观察可以得出:
- 所有近平面上的点都没有发生变换(因为所有的平面都要挤压的近平面的大小,近平面并不需要挤压,所以不发生变化)
- 所有远平面上的点的z的分量不会发生变化(因为挤压只挤压了平面的大小,并没有移动远平面的位置)
根据 近平面坐标点不变的特点 ,因为近平面的点不变,所以输入的点和输出的点应该是一样的。这里点相等的表示方法跟前面回顾的知识点:齐次坐标 有关。
所以可以推出下列关系。
近平面的点(x,y,n,1),与齐次坐标下的(nx,ny,n²,n)是同一个点。
所以 向量(x,y,n,1) 与矩阵 M(persp->ortho) 相乘,最后要得出向量 (nx,ny,n²,n)。
根据这个关系可以算出矩阵 M(persp->ortho) 未知的第三行的格式为(0,0,A,B)。前两个数应该为零,因为得数中不包括x和y,后两个数与n有关,所以设为未知数A,B
最后得到近平面与A、B有关的关系式:
根据远平面上:
- 所有远平面上的点的z的分量不会发生变化
- 并且(0,0,f,1)指的是远平面上的中点,因为中点在前面就解释过了不会发生变化
可以得到下面的式子:
最后根据远近两个平面的关系式,可以得出A、B的表达式:
到此为止,平截头体的”挤压”推理已经完成,M(persp->ortho)矩阵也是可知的了。
接下来需要完成的是做正交投影。
完成以上步骤才是正式完成透视投影。正交投影的变换在上面有解释。