左乘

齐次变换可以是相对于共同的参考座标系的变换,也可以相对于变换过程中不同的当前座标系来实现变换。不同的变换矩阵相乘的顺序(左乘与右乘),可以得到不 同(相反)的结果。由于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下进行绘制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章