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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.