openGL中的全域性固定座標系統和區域性移動座標系統

2021-06-26 19:41:43 字數 1321 閱讀 9653

最近在看《opengl程式設計指南》(紅寶石書),裡面有乙個全域性固定座標系統和區域性移動座標系統的概念,下面是對這兩個概念的理解。以書中3.2.1節中的例子來說明,先上**。

//code_1

gltranslatef(3, 0, 0);

glrotatef(45, 0, 0, 1);

glutwirecube(2);

這段**將乙個方塊先繞z軸旋轉45度,然後移到(3, 0, 0)的位置。首先,opengl中矩陣乘法的運算是以與變換函式的順序相反的順序進行的,也就是說當n,m,l三個變化矩陣以下面code_2的順序出現時,其變換是這樣的(n(m(lv))),v是某個要繪製的頂點。

//code_2

glmultmatrixf(n);

glmultmatrixf(m);

glmultmatrixf(l);

glbegin(gl_points);

glvertex3f(v);

glend();

那麼,對於code_1,很顯然,方塊先進行rotate變換,再進行translate變換。這時候,引入全域性固定座標系統和區域性移動座標系統的概念只是對這一過程的兩種不同的理解方式。

對於全域性固定座標系統,由於方塊與所有其他物件使用同一的座標系統,那麼此時為了使得旋轉後的方塊位於x軸上3個單位的位置上,就必須先將其繞其座標系的z軸旋轉,然後再進行平移,否則如果平移後再繞z軸旋轉,方塊就不會在x軸上了。

而對於區域性移動座標系統,假設方塊自己有乙個虛擬的座標系,開始的時候這個座標系與世界座標一致,那麼當進行translate變換時,這個虛擬座標系平移了,方塊保持在該座標系的位置不變,所以也平移了,之後進行rotate變換也是相對於這個虛擬座標系的,所以方塊還是在x軸上。

所以說,這兩個概念只是為了方便我們理解而提出的。

作為例子,考慮下面**code_3

//code_3

glrotatef(45, 0, 0, 1);

gltranslatef(3, 0, 0);

glutwirecube(2);

這段**,從全域性固定座標系統來看,它是先將方塊平移到了(3, 0, 0)的位置,然後將其繞z軸旋轉45度,顯然這時方塊應該位於(3/sqrt(2),  3/sqrt(2), 0)處,而從區域性移動座標系來看,它先將方塊繞虛擬座標系的z軸旋轉了45度,然後在沿該虛擬座標系的x軸平移了3個單位,位置還是在(3/sqrt(2),  3/sqrt(2), 0)處。

現在明白了,所謂的全域性固定座標系統和區域性移動座標系統,其實只是我們理解同乙個問題的兩個不同的方式而已。

OpenGL中的座標系與矩陣

1.opengl圖形管線 顯示流程 模型變換 modeling transformation mc 模型座標 child parent wc 世界座標 標準c語言的矩陣為行主序,即m i j 表示第i行 第j列。opengl中的矩陣為 列主序,即m i j 表示第i列 第j行。以下所有矩陣都為列主序...

OpenGL中的座標系和變換

模型座標是以物體某一點為原點而建立的座標系,該座標系僅對該物體適用,用來簡化對物體各部分座標的描述。物體放到場景中時,各部分經歷的座標變換相同,相對位置不變,所以可視為乙個整體,與人類的思維習慣一致。世界座標係以螢幕中心為原點 0,0,0 你面對螢幕,你的右邊是x正軸,上面是y正軸,螢幕指向你的為z...

gazebo中的座標系

1 gazebo中link和joint中都有origin的元素。弄了半天好像是明白了。link定義了各個部件的幾何模型,joint定義了各幾何模型直接的座標位置。joint中的origin就是這種連線關係建立的座標系的原點和朝向。比如,就是在世界座標系的 1,0,1 這個點建立了乙個子座標系。而li...