左乘

齊次變換可以是相對於共同的參考座標系的變換,也可以相對於變換過程中不同的當前座標系來實現變換。不同的變換矩陣相乘的順序(左乘與右乘),可以得到不 同(相反)的結果。由於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下進行繪製。

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