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