2012年5月10日 星期四

OpenGL: Nate Robins - Tutors 01

since: 2012/05/09
update: 2012/05/10

reference:
1. Nate Robins - OpenGL - Tutors
2. Tutorial 3 : Matrices | opengl-tutorial.org
3. 齊次座標

Transformation(轉換)

A. Homogeneous coordinates(齊次座標): 

      1. 齊次座標可以讓我們使用同一種數學方程式, 來對(頂點)向量處理:
          平移
, 縮放旋轉的問題.

      2. 在齊次座標中, 我們引入了 w 參數到原本三維的座標: (x, y ,z) 裡:
           (x, y, z, w), w 代表座標軸的遠近參數. 要將齊次座標轉換為三維座標,
           其方式為: (x/w,  y/w, z/w).

      3. (x, y, z, w) 在齊次座標中:
          當 w == 1, 代表此為空間中的一個位置(頂點). => (x/1, y/1, z/1) = (x, y, z)
          當 w == 0, 代表此為一個向量. => (x/0, y/0, z/0)

-------------------------------------------------------------------------------------

B. Transformation Matrices(轉換矩陣):
     1. 矩陣介紹:
          a. 簡單來說, 矩陣是一個在預先定義好(row, 水平向)與(column, 垂直向)
              的架構裡存放數值陣列. 舉例: 2(row) x 3(column) 矩陣如下所示:

          b. 在 3D 繪圖中, 我們會使用 4x4 矩陣. 藉由將矩陣與頂點相乘, 可以用來
              轉換 (x,y,z,w) 頂點:    

             (4x4)矩陣 x 頂點 = 轉換的頂點 (x', y', z', w')

****************************************************************

     2. Identity Matrix(單位矩陣):
          a. 說明: 在線性代數中, n 階單位矩陣, 是一個 n x n 的方形矩陣, 其主對角線元素
                         為 1, 其餘元素為 0.

          b. 單位矩陣乘以任何座標(x, y, z, w), 其結果還是原始座標(x, y, z, w).


****************************************************************

    3. Translation Matrices(位移矩陣):
           a. 位移矩陣如下所示, 其中 X, Y, Z 分別為各軸的位移量.

           b. 例如: 將頂點 (10,10,10,1) 往 X 軸方向位移 10 個單位, 結果為: (20,10,10,1)
               (備註: 在此 w = 1, 所以是頂點)

           c. 接著, 來看看一個朝著負 Y 軸方向的向量 (0, 0, -1, 0), 往 X 軸方向位移 10
               單位, 其結果會是如何? (備註: 在此 w = 0, 所以是向量)
               結果: 原始向量不會改變.

****************************************************************


    4. Scaling Matrices(縮放矩陣):
          a. 縮放矩陣如下所示, 其中 X, Y, Z 分別為各軸的縮放比例.

          b. 例如, 對一個座標(x, y, z, w)在各方向放大 2 個單位:

          c. 備註:
               (1). w 值不會變.
               (2). 單位矩陣縮放矩陣的特例, 當其縮放比例: (X,Y,Z) = (1,1,1).
               (3). 單位矩陣亦為位移矩陣的特例, 當其各軸位移量: (X,Y,Z) = (0,0,0).

****************************************************************

     5. Rotation Matrices(旋轉矩陣):
      (圖片來源: 齊次座標)

****************************************************************

     6. Culumating Transformations(轉換計算):
          a. 例如: 轉換的座標 = 縮放矩陣 x 旋轉矩陣 x 位移矩陣 x 原始座標
              說明: 實際上矩陣相乘的順序為: 位移(先), 旋轉, 縮放(最後). 
                        (從右到左, 離遠始座標最近的先計算)

          b. 事實上, 以上的順序也是遊戲角色與其它物品常會使用到的:
              先置放位置(位移), 然後改變方向(旋轉), 接著縮放大小(如果有需要的話).

-------------------------------------------------------------------------------------

C. The Model, View and Projection Matrices
      1. 說明:
         Model, ViewProjection(投影) 矩陣, 是一個可以用來清楚的區分轉換的方便工具.

****************************************************************

      2. The Model Matrix:
          a. Model Space:
              所有的頂點是相對於此 model 的中心點而定義的, 亦即物件的中心點是 (0,0,0).

          b. World Space:
              所有的頂點是相對於世界的中心而定義的.

            c. 藉由 Model Matrix, 我們將一個 Model 從 Model Space 移到了 World Space.

****************************************************************

      3. The View Matrix:
           a. Camera Space:
               所有的頂點是相對於 camera 而定義的.


           b. 最初 camera 是在 World Space 的原點(0,0,0), 我們可藉由移動 camera 來
               相對的移動整個世界(從 camera 的觀點來看). 

           c. 所以, 將 camera 向右 (正 X 軸) 移動 3 個單位, 等同於將整個世界(包含世界
               座標裡的 Model)向左 (負 X 軸) 移動 3 個單位. 

           d. 藉由 View Matrix, 我們將一個 Model 從 World Space 移到了 Camera Space.


****************************************************************

      4. The Projection Matrix:
            a. Homogeneous Space:
                所有被定義在一個小立方體(cube)裡的頂點, 才會在螢幕上呈現.

            b. 在 Camera Space 中, 座標為 (0, 0) 的點將會被畫在螢幕的中心

            c. Perspective Projection(透視投影):
                我們不能只用 (x, y) 座標來決定物件擺放在螢幕的位置, 也要將物件到 camera
                的距離(z)計算在內. 對於二個有相似 x, y 座標的頂點, 其中有較大 z 座標的頂點
                (代表距離 camera 較近), 將會比另一個頂點更位在螢幕的中心處. 這就叫做
                透視投影
.

            d. 最後, 藉由 Projection Matrix, 我們將一個 Model 從 Camera Space 移到了
                 Homogeneous
Space.

-------------------------------------------------------------------------------------

D. The Transformation Tutorial Program
     1. 開啓 I touchs: OpenGL: Nate Robins - Tutors 00 中調整好的專案, 將
         active scheme 選為 transformation 後執行.


****************************************************************
     2. Translation(位移):

        glTranslatef(X 軸位移量, Y 軸位移量, Z 軸位移量);
       說明: 此處車子正 X 軸位移 0.2 個單位;
                 相對的, camera 會向負 X 軸位移 0.2 個單位.

****************************************************************
     3. Rotation(旋轉):

        glRotatef(旋轉角度, X 軸向量, Y , Z );

****************************************************************
     4. Scaling(縮放):

        glScalef(沿 X 軸的縮放係數, 沿 Y 軸的縮放係數, 沿 Z 軸的縮放係數);
       說明: 此處沿 Z 軸放大 1.50 倍, 就像車子沿著正前方開過來.

2 則留言:

注意:只有此網誌的成員可以留言。