OpenGL中在窗口的大小發生變化的時候會觸發resize()函數,這裡會傳入一個新的寬和高,在resize()函數中我們會設置投影矩陣,在可以使用OpenGL基礎函數glFrustum()函數和glu函數gluPerspective()函數。網上介紹兩個函數聯系比較少,所以自己研究呗。
OpenGL函數glFrustum是建立一個平截頭體的函數,在建立投影矩陣的時候使用。glu的gluPerspective()函數是對OpenGL基礎函數glFrustum()的封裝。兩者提供的參數也不一致,那麼gluPerspective()函數又是如何對glFrustum()函數進行封裝呢?
下面是兩個函數的聲明:
glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);
gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);
要理解兩者間的聯系,還得研究它們的原理。下面是兩個函數的原理圖:
理解了這些關系之後就可以列出兩者之間的轉換關系了。
void MyPerspective( GLdouble fov, GLdouble aspectRatio, GLdouble zNear, GLdouble zFar )
{
// 使用glu庫函數,需要添加glu.h頭文件
//gluPerspective( fov, aspectRatio, zNear, zFar );
// 使用OpenGL函數,但是需要添加math.h頭文件
GLdouble rFov = fov * 3.14159265 / 180.0;
glFrustum( -zNear * tan( rFov / 2.0 ) * aspectRatio,
zNear * tan( rFov / 2.0 ) * aspectRatio,
-zNear * tan( rFov / 2.0 ),
zNear * tan( rFov / 2.0 ),
zNear, zFar );
}
如果出於某種原因無法使用glu庫,那麼就使用替代方法和glFrustum()函數吧。