左乘&右乘

来源:互联网 发布:易语言vip解析源码 编辑:程序博客网 时间:2024/05/02 06:05
  齐次变换可以是相对于共同的参考坐标系的变换,也可以相对于变换过程中不同的当前坐标系来实现变换。不同的变换矩阵相乘的顺序(左乘与右乘),可以得到不 同(相反)的结果。由于OpenGL使用的是左乘(向量左乘变换矩阵),这里用左乘来举例。

    对于变换矩阵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下进行绘制。


原创粉丝点击