在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()it
這個函數原型爲:
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值相同了,視景體深度沒有了,整個視景體都被壓成個平面了,就會顯示不正確。rust