对于变换矩阵R = Rz * Ry * Rx
1) 相对于参考坐标系O(固定)的变换
V’ = R * V = Rz * Ry * Rx V,对于左乘变换矩阵(从右向左进行),其变换为V向量对于参考坐标系(固定)先绕x轴旋转,再绕y轴旋转,最后绕z轴旋转,得到的新向量V’,在整个变 换过程中均是相对于同一坐标系O的x,y,z轴进行的,得到的V’也是同一参考坐标系O中的矢量。
2) 相对于当前坐标系的变换
则每个平移、旋转变换始终相对于当前坐标系(坐标系随着平移、旋转)。变换顺序为从左往右(即右乘矩阵)。对于V’ = R * V = Rz * Ry * Rx V,相当于最初的参考坐标系O,绕z轴旋转(变成O1),再绕y轴旋转(变成O2),最后绕x轴旋转(变成O3)。得到的V’是O3坐标轴中的V在原始坐 标轴O下的矢量。
所以对于同一的变化矩阵R,可以理解为两种不同的变换方法。
OpenGL对模型进行旋转、平移和缩放。用到三个子函数: glTranslate*(x, y, z) 、 glRotate*(x, y, z) 、 glScale*(x, y, z) 。每个函数都会产生一个矩阵,并右乘当前矩阵。
对与变换:
glRotatef(45.0, 0.0, 0.0, 1.0);
glTranslatef(3.0, 0.0, 0.0);
这 两个变换,可以看成:
glMultMatrixf(R);
glMultMatrixf(T);
R,T 都是右乘到CTM(当前变换矩阵):CTM = CTM * R * T
对模型变换的理解有两种:
1) 在固定坐标系下,对物体进行变换。这时候,要以相反的顺序来考虑代码中的变换函数了,它的实际过程是这样 P = CTM *( R*(T* P’))。首先对物体进行平移,平移到坐标(3.0, 0.0, 0.0)。然后,把物体相对原点绕z轴旋转45度。
2) 物体捆绑在局部坐标系下,所有的变换都是在当前坐标系进行的。这时,变换可以看成:
glRotatef(45.0, 0.0, 0.0, 1.0) 产生一个齐次矩阵 R(代表一个局部坐标系),即局部坐标系R 相对刚才开始的坐标系I(单位矩阵)作了旋转变换,绕z轴旋转了45度。
glTranslatef(3.0, 0.0, 0.0) 产生一个齐次矩阵 T (也是代表了一个局部坐标系),相对 R 坐标系沿x轴(R系)平移了3个单位,得到了自己的局部坐标系T,最后在T下进行绘制。