上一節教您三角形和四邊形的著色。這一課將教您如何將這些彩色物件繞著坐標軸旋轉。
其實只要在上節的程式碼上增加幾行就可以了。下面將整個例程重寫一遍。方便您知道增加了什麼,修改了什麼。
增加兩個變數來控制這兩個物件的旋轉。這兩個變數加在程式的開始處其他變數的後面( bool fullscreen=TRUE;下面的兩行)。它們是浮點類型的變量,使得我們能夠非常精確地旋轉物件。浮點數包含小數位置,這表示我們不需要使用1、2、3...的角度。你會發現浮點數是OpenGL程式設計的基礎。新變數中叫做rtri 的用來旋轉三角形, rquad 旋轉四邊形。
Var
……
rtri : GLfloat; // 用於三角形的角度( 新增)
rquad : GLfloat; // 用於四邊形的角度( 新增)
……
然後修改glDraw()如下:
PRocedure glDraw();
Begin
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT); // 清除螢幕與深度緩存
glLoadIdentity(); // 重置目前的模型觀察矩陣
//下一行程式碼是新的。 glRotatef(Angle,Xvector,Yvector,Zvector)負責讓物件繞某個軸旋轉。
//這個指令有很多用處。 Angle 通常是變數代表物件轉過的角度。
//Xvector , Yvector 和Zvector 三個參數則共同決定旋轉軸的方向。
//例如(1,0,0)所描述的向量經過X座標軸的1個單位並且方向向右。
//(-1,0,0)所描述的向量經過X座標軸的1個單位處,但方向向左。
//D. Michael Traub:提供了對Xvector , Yvector 和Zvector 的上述解釋。
//為了更好的理解X, Y 和Z的旋轉,我舉些例子...
//X軸-您正在使用一台台鋸。鋸片中心的軸由左至右擺放(就像OpenGL中的X軸)。
//尖利的鋸齒繞著X軸狂轉,看起來要嘛向上轉,要嘛向下轉。
//取決於鋸片開始轉時的方向。這與我們在OpenGL中繞著X軸旋轉什麼的情形是一樣的。
//(譯者註:這會兒您要把臉蛋湊向顯示器的話,保準被鋸開了花^-^。)
//Y軸-假設您正處於一個巨大的龍捲風中心,龍捲風的中心從地面指向天空(就像OpenGL中的Y軸)。
//垃圾和碎片圍著Y軸從左向右或是從右向左狂轉不止。
//這跟我們在OpenGL中繞著Y軸旋轉什麼的情形是一樣的。
//Z軸-您從正前方看著一台風扇。風扇的中心正好朝著您(就像OpenGL中的Z軸)。
//風扇的葉片繞著Z軸順時針或逆時針狂轉。這與我們在OpenGL中繞著Z軸旋轉什麼的情形是一樣的。
glTranslatef(-1.5, 0.0, -6.0); // 左移1.5 單位,並移入螢幕6.0
//下面的一行程式碼中,如果rtri等於7,我們將三角形繞著Y軸從左向右旋轉7 。
//您也可以改變參數的值,讓三角形繞著X和Y軸同時旋轉。
glRotatef(rtri, 0.0, 1.0, 0.0); // 繞Y軸旋轉三角形( 新增)
//下面的程式碼沒有變化。在螢幕的左面畫了一個彩色漸層三角形,並繞著Y軸從左到右旋轉
glBegin(GL_TRIANGLES); // 繪製三角
glColor3f(1.0, 0.0, 0.0); //設定目前色為紅色
glVertex3f(0.0, 1.0, 0.0); // 上頂點
glColor3f(0.0, 1.0, 0.0); //設定目前色為綠色
glVertex3f(-1.0, -1.0, 0.0); // 左下
glColor3f(0.0, 0.0, 1.0); //設定目前色為藍色
glVertex3f(1.0, -1.0, 0.0); // 右下
glEnd(); // 三角形繪製結束
//您會注意下面的程式碼中我們增加了另一個glLoadIdentity()呼叫。
//目的是為了重置模型觀察矩陣。
//如果我們沒有重置,直接呼叫glTranslate的話,會出現意料之外的結果。
//因為座標軸已經旋轉了,很可能沒有朝著您所希望的方向。
//所以我們本來想要左右移動物件的,就可能變成上下移動了,取決於您將座標軸旋轉了多少角度。
//試試將glLoadIdentity() 註解掉之後,會出現什麼結果。
//重置模型觀察矩陣之後,X,Y,Z軸都以重位,我們呼叫glTranslate。
//您會注意到這次我們只向右一了1.5單位,而不是上課的3.0單位。
//因為我們重置場景的時候,焦點又回到了場景的中心(0.0)。
//這樣就只要向右移1.5單位就夠了。
//當我們移到新位置後,繞X軸旋轉四邊形。正方形將上下轉動。
glLoadIdentity(); // 重置模型觀察矩陣
glTranslatef(1.5, 0.0, -6.0); // 右移1.5單位,並移入螢幕6.0
glRotatef(rquad, 1.0, 0.0, 0.0); // 繞X軸旋轉四邊形( 新增)
glBegin(GL_QUADS); // 繪製正方形
glColor3f(0.6, 0.2, 2.0); //設定目前色為紫色
glVertex3f(-1.0, 1.0, 0.0); // 左上
glVertex3f(1.0, 1.0, 0.0); // 右上
glVertex3f(1.0, -1.0, 0.0); // 左下
glVertex3f(-1.0, -1.0, 0.0); // 右下
glEnd(); // 正方形繪製結束
//下兩行是新增的。
//倘若把rtri 和rquad 想像為容器,
//那麼在程式的開始我們創建了容器(rtri , 和rquad )。
//當容器建立之後,裡面是空的。
//下面的第一行程式碼是在容器中加入0.2。
//因此每次當我們運行完前面的程式碼後,都會在這裡使rtri 容器中的值成長0.2。
//後面一行將rquad 容器中的值減少0.15。
//同樣每次當我們運行完前面的程式碼後,都會在這裡使rquad 容器中的值下跌0.15。
//下跌最終會導致物件旋轉的方向和成長的方向相反。
rtri := rtri + 0.2; // 增加三角形的旋轉變數(新增)
rquad := rquad - 0.15; // 減少四邊形的旋轉變數(新增)
End;