原文:http://www.cnblogs.com/kekec/archive/2010/08/04/1792442.html
概述
全局坐標系是三維空間物體所在的坐標系,模型的頂點坐標就是基於這個坐標系來表達的。而局部坐標系是一個假想的坐標系,該坐標系與物體的相對位置至始至終是不變的,假想出這個坐標系的目的主要是為了正向理解對三維場景中物體執行的“平移和旋轉”操作。使用局部坐標系理解模型變換時,所有的變換操作直接作用與局部坐標系,由於局部坐標系與物體的相對位置不對,因此,當對局部坐標系進行“平移”、“旋轉”和“縮放”時,物體在場景中位置和形狀也會發生相應的變化。
所謂局部坐標系(Local Coordinate),也就是坐標系以物體的中心為坐標原點,物體的旋轉或平移等操作都是圍繞局部坐標系進行的,這時,當物體模型進行旋轉或平移等操作時,局部坐標系也執行相應的旋轉或平移操作。
幾點注意
(1)“全局坐標系”和“局部坐標系”是兩種理解模型變換的手段。
(2)當存在“縮放”變換時,應采用“全局坐標系”“反向”閱讀代碼來理解。如果存在縮放變換,尤其當縮放不均勻時,采用“局部坐標系”來理解可能產生問題。經過不均勻的縮放后,坐標系被拉伸,因此平移頂點時,沿各個軸移動的距離將增大(縮小)相應的縮放倍數。如果進行不均勻縮放的同時進行了旋轉變換,局部坐標系各個軸可能將不再相互垂直。
(3)對於多次交換使用“平移”和“縮放”操作的情況,宜用“局部坐標系”“正向”閱讀代碼來理解。
(4)對於像樹形結構的物體,如機械人,太陽系,紅寶書的建議是從“局部坐標系”來看。
使用全局坐標系為什么要用“反向”閱讀代碼的方式來理解?
先看看下面這段代碼:
2 {
3 glMatrixMode(GL_MODELVIEW);
4 glLoadIdentity(); // 當前矩陣設置為單位矩陣
5 glRotatef(45.0f,0.0,0.0,1.0); // 繞z軸旋轉45度
6 glTranslatef(2.0,2.0,2.0); // 平移至 [2.0,2.0,2.0]
7 glBegin(...); // 開始繪制三維物體
8 ...
9 ...
10 ...
11 glEnd();
12 }
R為 glRotatef(45.0f,0.0,0.0,1.0) 產生的矩陣。
T為 glTranslatef(2.0,2.0,2.0) 產生的矩陣。
E為單位陣, M為經過旋轉平移之后的視點模型變換矩陣。
M=E*R*T 【這是一個矩陣右乘操作】
理論上來講 這就是一個坐標系的變換過程,R*T 這個矩陣其實就是將原先的坐標系變換到現在的坐標系,這個時候原先坐標系的點p將變換成q。
q=(R*T)*p 【T和p先進行乘法得到一個中間向量,R再和這個向量做乘法,最后算的q向量】
而按照全局坐標系的理解,它的變換過程則是相反的,這也是相當的好理解的.在當前世界坐標系中畫好該物體之后,要想將它移動到正確的位置,必須得先平移物體到[2.0,2.0,2.0],然后將物體繞z軸旋轉45度。這是一個相反的變換過程。