區分glFrustum和gluPerspective

(1)

先說一下glFrustum,當然這兩個都是創建視圖,都可以達到同樣的效果。

函數原型:

void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);


先上圖,雖然畫的很糟糕(圖上說明與函數參數相對應,45度是將要得出的廣角先不考慮):

glFrustum

(灰色區域和DE後區域爲不可見區,藍色區域爲可見區)

如果希望得到45度的廣角,又希望所畫的最小範圍爲(-2-2)到(22)即near面的範圍(即BC長爲4),繼而可以得到near值的大小爲2/tan22.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哦......以上純屬個人見解筆記呵!!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章