在OpenGL中,如果想對模型進行操作,就要對這個模型的狀態(當前的矩陣)乘上這個操作對應的一個矩陣.
如果乘以變換矩陣(平移, 縮放, 旋轉), 那相乘之後, 模型的位置被變換;
如果乘以投影矩陣(將3D物體投影到2D平面), 相乘後, 模型的投影方式被設定;
如果乘以紋理矩陣(), 模型的紋理方式被設定.
而用來指定乘以什麼類型的矩陣, 就是glMatriMode(GLenum mode);
glMatrixMode有3種模式: GL_PROJECTION 投影, GL_MODELVIEW 模型視圖, GL_TEXTURE 紋理.
所以,在操作投影矩陣以前,需要調用函數:
glMatrixMode(GL_PROJECTION); //將當前矩陣指定為投影矩陣
然後把矩陣設為單位矩陣:
glLoadIdentity();
然後調用glFrustum()或gluPerspective(),它們產生的矩陣會與當前的矩陣相乘,產生透視的效果;
1.glFrustum()
這個函數原型為:
void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
建立一個透視型的視景體。其操作是建立一個透視投影的矩陣,並且用這個矩陣乘以當前矩陣。這個函數的參數只定義近裁剪平面的左下角點和右上方點的三維空間座標,即(left,bottom,-near)和(right,top,-near);最後一個參數far是遠裁剪平面的離視點的距離值,其左下角點和右上方點空間座標由函數根據透視投影原理自動產生。near和far表示離視點的遠近,它們總為正值(near/far 必須>0)。
2.gluPerspective()
這個函數原型為:
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
建立一個對稱的透視型視景體,但它的參數定義於前面的不同,如圖。其操作是建立一個對稱的透視投影矩陣,並且用這個矩陣乘以當前矩陣。參數fovy定義視野在Y-Z平面的角度,範圍是[0.0, 180.0];參數aspect是檢視平面寬度與高度的比率;參數Near和Far分別是近遠裁剪面到視點(沿Z負軸)的距離,它們總為正值。
以上兩個函數預設時,視點都在原點,視線沿Z軸指向負方向。
void mydisplay (void)
{
......
glMatrixMode (GL_PROJECTION);
LoadIdentity ();
Frustum (left, right, bottom, top, near, far);
......
}
3.glOrtho()
這個函數的原型為:
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)
六個參數, 前兩個是x軸最小座標和最大座標,中間兩個是y軸,最後兩個是z軸值
它建立一個平行視景體(就是一個長方體空間地區)。
實際上這個函數的操作是建立一個正射投影矩陣,並且用這個矩陣乘以當前矩陣。
其中近裁剪平面是一個矩形,矩形左下角點三維空間座標是(left,bottom,-near),
右上方點是(right,top,-near);遠裁剪平面也是一個矩形,左下角點空間座標是(left,bottom,-far),右上方點是(right,top,-far)。
注意,所有的near和far值同時為正或同時為負, 值不能相同。如果沒有其他變換,正射投影的方向平行於Z軸,且視點朝向Z負軸。這意味著物體在視點前面時far和near都為負值,物體在視點後面時far和near都為正值。
只有在視景體裡的物體才能顯示出來。
如果最後兩個值是(0,0),也就是near和far值相同了,視景體深度沒有了,整個視景體都被壓成個平面了,就會顯示不正確。