回覆列表
  • 1 # 藍風24

    從“相對移動”的觀點來看,改變觀察點的位置與方向和改變物體本身的位置與方向具有等效性。在OpenGL中,實現這兩種功能甚至使用的是同樣的函式。

    由於模型和檢視的變換都透過矩陣運算來實現,在進行變換前,應先設定當前操作的矩陣為“模型檢視矩陣”。設定的方法是以GL_MODELVIEW為引數呼叫glMatrixMode函式,像這樣:

    glMatrixMode(GL_MODELVIEW);

    通常,我們需要在進行變換前把當前矩陣設定為單位矩陣。這也只需要一行程式碼:

    glLoadIdentity();

    然後,就可以進行模型變換和檢視變換了。進行模型和檢視變換,主要涉及到三個函式:

    glTranslate*,把當前矩陣和一個表示移動物體的矩陣相乘。三個引數分別表示了在三個座標上的位移值。

    glRotate*,把當前矩陣和一個表示旋轉物體的矩陣相乘。物體將繞著(0,0,0)到(x,y,z)的直線以逆時針旋轉,引數angle表示旋轉的角度。

    glScale*,把當前矩陣和一個表示縮放物體的矩陣相乘。x,y,z分別表示在該方向上的縮放比例。

    注意我都是說“與XX相乘”,而不是直接說“這個函式就是旋轉”或者“這個函式就是移動”,這是有原因的,馬上就會講到。

    假設當前矩陣為單位矩陣,然後先乘以一個表示旋轉的矩陣R,再乘以一個表示移動的矩陣T,最後得到的矩陣再乘上每一個頂點的座標矩陣v。所以,經過變換得到的頂點座標就是((RT)v)。由於矩陣乘法的結合率,((RT)v) = (R(Tv)),換句話說,實際上是先進行移動,然後進行旋轉。即:實際變換的順序與程式碼中寫的順序是相反的。由於“先移動後旋轉”和“先旋轉後移動”得到的結果很可能不同,初學的時候需要特別注意這一點。

    OpenGL之所以這樣設計,是為了得到更高的效率。但在繪製複雜的三維圖形時,如果每次都去考慮如何把變換倒過來,也是很痛苦的事情。這裡介紹另一種思路,可以讓程式碼看起來更自然(寫出的程式碼其實完全一樣,只是考慮問題時用的方法不同了)。

    讓我們想象,座標並不是固定不變的。旋轉的時候,座標系統隨著物體旋轉。移動的時候,座標系統隨著物體移動。如此一來,就不需要考慮程式碼的順序反轉的問題了。

    以上都是針對改變物體的位置和方向來介紹的。如果要改變觀察點的位置,除了配合使用glRotate*和glTranslate*函式以外,還可以使用這個函式:gluLookAt。它的引數比較多,前三個引數表示了觀察點的位置,中間三個引數表示了觀察目標的位置,最後三個引數代表從(0,0,0)到 (x,y,z)的直線,它表示了觀察者認為的“上”方向。

  • 中秋節和大豐收的關聯?
  • 給你1000每天的薪水,你願意去當掏糞工,馬路清潔工嗎?