(1)
先說一下glFrustum,當然這兩個都是創建視圖,都可以達到同樣的效果。
函數原型:
void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
先上圖,雖然畫的很糟糕(圖上說明與函數參數相對應,45度是將要得出的廣角先不考慮):
(灰色區域和DE後區域爲不可見區,藍色區域爲可見區)
如果希望得到45度的廣角,又希望所畫的最小範圍爲(-2,-2)到(2,2)即near面的範圍(即BC長爲4),繼而可以得到near值的大小爲(2/tan(22.5))
,約爲4.838,即AA‘爲4.838
舉個例子(畫一個滿屏的三角形):
void Reshape(int width, int height)//重繪窗口
{
// 創建透視效果視圖
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-2, 2, -2, 2, 4.828, 100);
glViewport(0, 0, width, height);
glMatrixMode(GL_MODELVIEW);
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, -4.828);//將球移入near內
glBegin(GL_TRIANGLES);//畫一個低邊爲4的三角形,與最小平面範圍等大
glVertex3d(-2, -2, 0);
glVertex3d(2, -2, 0);
glVertex3d(0, 2, 0);
glEnd();
glutSwapBuffers();
}
運行結果:()
當我們對函數的參數設置不恰當時,就會發生一些一想不到的效果:
比如將參數設爲: glFrustum(-10, 10, -10, 10, 0.1, 100);//相當這個廣角很大,相當把眼睛睜開接近180度(有誰能做到嗎),結果是什麼都沒有,但是用glPerspective設
爲接近180度,會發現圖形顯得很小很小,因爲你設置的是看見整個視野......
(2)
gluPerspective
函數原型:
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
同樣達到glFrustum的效果,此時fovy對應上圖的45度,aspect爲寬高比(即top邊與right邊的長度比),zNear和zFar概念和glFrustum相同
例子(得到和上一個例子一樣的效果)
void Reshape(int width, int height)
{
// 創建透視效果視圖
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glFrustum(-2, 2, -2, 2, 4.828, 100);
gluPerspective(45.0f,1,4.828f,100.0f);//廣角爲45度,
glViewport(0, 0, width, height);
glMatrixMode(GL_MODELVIEW);
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0f, 0.0f, -4.828f);
glBegin(GL_TRIANGLES);
glVertex3d(-2, -2, 0);
glVertex3d(2, -2, 0);
glVertex3d(0, 2, 0);
glEnd();
glutSwapBuffers();
}
運行結果:(和glFrustum效果一樣)
總之,習慣用那個就用哪個,只不過個人覺得glPerspective更直觀一些更方便不容易睜得過頭了呵,但是要包含glu.h哦......以上純屬個人見解筆記呵!!