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. 概觀圖
頂點轉換過程的其中三個階段:
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, atx, aty, atz, upx, upy, upz);
b. (atx, aty, atz): 代表眼睛(或相機)所觀看的位置(座標).
c. (upx, upy, upz): 代表眼睛(或相機)上方的向量.
備註: 亦即眼睛(或相機)的正上方是哪個方向?
例如:
(upx, upy, upz) = (0, 1, 0) // 相機的正上方朝向 Y 軸.
(upx, upy, upz) = (2, 1, 0) // 相機的正上方朝向 (2, 1, 0) 方向.
-------------------------------------------------------------------------------------------
C. 階段二的正交投影
1. 圖示: C. 階段二的正交投影
說明:
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).
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 後執行.
a. 相機位置往正 X 軸方向移動 2 個單位.
調整成相機正上方的方向向量為: (1.0, 1.0, 0.0).
a. 擴大投影的視野角度(field of view Y), 如同廣角鏡的效果.
可能只會看到模型背部的部分切面.
可能只會看到模型前半部切面.
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。