2012年5月14日 星期一

OpenGL: Nate Robins - Tutors 02

since: 2012/05/14
update: 2012/05/14

reference:
1. Nate Robins - OpenGL - Tutors
2. CG OpenGL 3D viewing-course 7
3. Computer Graphics 2011 (Chap 5:Viewing Transformation)
4. 靜宜大學資工系電腦圖學課程網頁 (OpenGL5.ppt)
5. Jaly's Web: 研究資料 (投影的介紹)
6. CS 330 Graphics--Viewing

Projection(投影)

A. 概觀
      1. 概觀圖


      2. 說明
            頂點轉換過程的其中
三個階段:
            a. 階段一:
                藉由 Model-View Matrix 轉換到 Camera
(Eye) Coordinates
                (1). 將 matrix mode 切換到 GL_MODELVIEW, 並呼叫 glLoadIdentity()
                       (單位矩陣).

                (2). 呼叫 gluLookAt().

                (3). model 轉換: 位移, 旋轉, 縮放 ....

            b. 階段二:
                藉由 Projection Matrix 轉換到 Homogeneous(Clip) Coordinates
                (1). 將 matrix mode 切換到 GL_PROJECTION, 並呼叫 glLoadIdentity()
                       (單位矩陣).


                (2). 如果要採用透視投影, 就呼叫 gluPerspective().

                (3).
如果要採用正交投影, 就呼叫 gluOrtho2D().


            c. 階段三:
                藉由 Viewport Transformation 轉換到 Window Coordinates

                呼叫 glViewport().

     3. 備註:       
          Perspective division
          這一個階段把 clip coordinate 的齊次座標 (x, y, z, w) 轉成三維座標
          (x/w, y/w, z/w)
, 稱之為 normalized device coordinates(正規化裝置座標).


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


B. 階段一的 gluLookAt()
     1. 說明:
         Model-View 矩陣是用來置放 camera 的位置, 通常可藉由 gluLookAt() 函式
         來輕易達成.

     2. gluLookAt() 函式說明:
         gluLookAt(eyex, eyey, eyez, atxatyatz, upxupyupz);

          a. (eyex, eyey, eyez): 代表眼睛(或相機)的擺放位置(座標).

          b. (atxatyatz): 代表眼睛(或相機)所觀看的位置(座標).

          c. (upxupyupz): 代表眼睛(或相機)上方的向量.
              備註: 亦即眼睛(或相機)的正上方是哪個方向?
              例如:
              (upx, upy, upz) = (0, 1, 0) // 相機的正上方朝向 Y 軸.

              (upx, upy, upz) = (2, 1, 0) // 相機的正上方朝向 (2, 1, 0) 方向.

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

C. 階段二的正交投影
     1. 圖示:
     說明:
         a. 正交投影可視空間平行六面體.

         b. 近端截取平面(near plane)與遠端截取平面(far plane)是一樣大的.

         c. 物體與觀察點距離的遠近並不會影響其顯示的大小

     2. 函式:
         glOrtho(GLdouble leftX, GLdouble rightX,
                        GLdouble bottomY, GLdouble topY,
                        GLdouble nearZ, GLdouble farZ);

         // 與 glOrtho() 相同, 其中 nearZ = 1 farZ = 1.
         glOrtho2D(GLdouble leftX, GLdouble rightX,
                              GLdouble bottomY, GLdouble topY);

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

D. 階段二的透視投影
     1. 圖示:

     說明:
         a. 近端截取平面(near plane)與遠端截取平面(far plane)並不一樣大.
         b. 物體會隨著與觀察點的距離而改變大小

     2. 函式:
          glFrustum( GLdouble leftX, GLdouble rightX,
                                GLdouble bottomY, GLdouble topY,
                                GLdouble nearZ, GLdouble farZ);

   
    // 建議使用
    gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);
     說明:
       a. fovy: field of view Y; 上下二個平面的角度.
       b. aspect: 的比(width/height).

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

E. 階段三的 glViewport()
      1. 說明:
          a. viewport 是指視窗上的一塊矩形區域. 可透過 viewport transformation
              將 normalized device coordinates 轉換成視窗座標.

          b. 藉由設定 viewpot 的原點位置, 寬度, 和高度. 調整寬和高之間的比例
              可以產生放大, 縮小, 壓扁, 拉長的效果.

      2. 函式:
           glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

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

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


    2. gluLookAt() // 置放 camera 的位置
        a. 相機位置往正 X 軸方向移動 2 個單位.

        b. 相機所觀看的中心位置, 往負 Y 軸方向移動 1 個單位.

        c. 原本相機的正上方朝向 Y 軸(0.0, 1.0, 0.0);
           調整成
相機正上方方向向量為: (1.0, 1.0, 0.0)

    3. gluPerspective() // 透視投影
          a. 擴大投影的視野角度(field of view Y), 如同廣角鏡的效果.

          b. 調整投影的 寬 / 高 之比例. (代表: 水平方向的視野)

          c. 當投影的 near plane 距離設的太遠, 例如, 在物體模型的後方,
              可能只會看到模型背部的部分切面.

          d. 同樣地, 當投影的 far plane 距離設的太近, 例如, 與物體模型相交會,
              可能只會看到模型前半部切面.

沒有留言:

張貼留言

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