【OpenGL】平移、旋转和缩放矩阵推导
平移
将点p(x,y,z)平移到p’(x’,y’,z’),在X轴、Y轴、Z轴三个方向上平移的距离分别为Tx,Ty,Tz,其中Tz为0(二维平面的平移),如图3.19所示。那么在坐标的对应分量上,直接加上这些T值,就可以确定p’的坐标了,如等式3.1所示。
比较等式3.5和等式3.1
这里第二个等式的右侧有常量项Tx,第一个等式没有,这意味着我们无法通过使用一个3X3的矩阵来表示平移。为了解决这个问题,我们可以使用一个4X4的矩阵,以及具有第四个分量(通常被设为1.0)的矢量。也就是说,我们假设点p的坐标为(x,y,z,1),平移以后的点p’的坐标为(x’,y’,z’,1),如等式3.8所示:
根据最后一个式子1=mx+ny+oz+p,很容易求出系数m=0,n=0,o=0,p=1。这些方程都有常数项d、h、l和p,看上去比较适合等式3.1(因为等式3.1中也有常数项)。等式3.1(平移)如下所示,我们将它与等式3.9进行比较:
比较x’,可知a=1,b=0,c=0,d=Tx;类似地,比较y’,可知e=0,f=1,g=0,h=Ty;比较z’,可知i=0,j=0,k=1,l=Tz。这样,你就可以写出来表示平移的矩阵,如等式3.10所示:
旋转
假设点p(x,y,z)绕Z轴旋转β角度以后变为了点p’(x’,y’,z’):首选旋转是绕Z轴进行的,所以z坐标不会变;在图3.22中,r是从原点到点p的距离,而α是X轴旋转到点p的角度。用这两个变量计算出点p的坐标,如等式3.2所示。
类似地,你可以使用r,α,β来表示点p’的坐标:
通过三角函数两角和公式
可得:
最后,将等式3.2代入上式,消除r和α,可得等式3.3。
通过等式3.4可得等式3.5
将等式3.5与等式3.3进行比较:
这样的话,如果设a=cosβ,b=-sinβ,c=0,那么这两个等式就完全相同了。在看y’:
这样的话,设d=sinβ,e=cosβ,f=0,这两个等式也就完全相同了。最后关于z’的等式更简单,设g=0,h=0,i=1即可。
将这些结果带入等式3.4中,得到等式3.7:
将旋转矩阵从一个3X3矩阵变为一个4X4矩阵,只需要将方程3.3和方程3.9比较一下即可。
例如,当你通过比较x’=xcosβ-ysinβ与x’=ax+by+cz+d时,可知a=cosβ,b=-sinβ,c=0,d=0。以此类推,求得y’和z’等式中的系数,最终得到4X4的旋转矩阵,如等式3.11所示:
缩放
仍然假设最初点p,经过缩放操作以后变成了p’。
假设在三个方向X轴,Y轴,Z轴的缩放因子Sx,Sy,Sz不相关,那么有:
将上式与等式3.9比较,可知缩放操作的变换矩阵: