投影變換是指設定視口面積和剪切平面,它在模型變換與視圖變換之後執行,用於確定那些多邊型模型位於視口之內. OpenGL支持兩類投影
投影變換(PROJECTION transformation) | 簡介 |
透視投影
glFrustum() gluPerspective() |
用於3D世界的顯示與真實世界一樣, 多邊型模型呈現近大遠小 |
正交投影
glOrtho() gluOrtho2D() |
不考濾與攝影機的距離,顯示多邊型模型真實的大小,常用於CAD軟件和2D遊戲,文本顯示 |
透視投影 | 簡介 |
void gluPerspective (
GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); |
直接指定視角和屏幕寬高比從而計算觀察截體. |
Fovy | 可視角度一般設為45度至90度 |
Aspect | 屏幕的寬高比(Width/Height) |
zNear | 近端剪切面距離 |
zFar | 遠端剪切面距離 |
透視投影 | 簡介 |
void glFrustum (
GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); |
觀察截體的計算由近端剪切面與遠端剪切面確定 |
Left right bottom top | 近端剪切面的範圍 |
zNear | 近端剪切面距離 |
zFar | 遠端剪切面距離 |
正交投影 | 簡介 |
Void glOrtho (
GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); |
相同的模型不管與攝影機距離的遠近,其呈現的相同大小 |
left right bottom top | 剪切面的範圍 |
zNear | 近端剪切面距離 |
zFar | 遠端剪切面距離 |
正交投影 | 簡介 |
void gluOrtho2D (
GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); |
相當於glOrtho(left,right,bottom,top,-1,1); |
left right bottom top | 剪切面的範圍 |
投影示例
- 選擇投影矩陣堆棧glMatrixMode(GL_PROJECTION);
- 載入單位矩陣glLoadIdentity()
- 設定透視投影或正交投影
投影函式
void Set_Projection_OpenGL(bool Is3D)
{
::glViewport(0,0,OpenGL_Width,OpenGL_Height); // 重置視區尺寸
::glMatrixMode(GL_PROJECTION); // 設定投影矩陣
::glLoadIdentity();// 載入單位矩陣
if(Is3D == true) // 3D投影計算窗口尺寸比例
gluPerspective(54.0f,(GLfloat)OpenGL_Width/(GLfloat)OpenGL_Height,1.0f,1000.0f);
else // 設為2D投影
gluOrtho2D(0, OpenGL_Width, 0, OpenGL_Height);
::glMatrixMode(GL_MODELVIEW); // 設定模型視圖矩陣
::glLoadIdentity();// 載入單位矩陣
}
投影演示程式如上圖:下載
- 按P鍵在正交投影與透視投影之間切換
- 按S鍵切換抗鋸齒功能
- 按1鍵切換為黃色
- 按2鍵切換為綠色
- 按3鍵切換為紅色
- 按F1鍵打開幫助
- 按ESC鍵旋轉角度清零
- 按+鍵加大直線寬度
- 按-鍵減小直線寬度