投影變換是指設定視口面積和剪切平面,它在模型變換與視圖變換之後執行,用於確定那些多邊型模型位於視口之內. 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鍵旋轉角度清零
- 按+鍵加大直線寬度
- 按-鍵減小直線寬度
你必須登入才能發表留言。