歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenGL中glFrustum()和gluPerspective()的相互轉換

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()函數吧。

Copyright © Linux教程網 All Rights Reserved