OpenGL 關於視景台gluPerpective,glFrustum的理解

來源:互聯網
上載者:User

 OpenGL 關於視景台gluPerpective,glFrustum的理解

作者:華文廣    [url]www.physdev.com [/url]
07/3/30

很多剛學OpenGL的朋友,都會對視景台的定義有很大的迷惑,這裡以我的經驗來解釋一下,希望對大家有所協助,
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
在這個函數中,有六下參數,這六個參數,都不是真實的全局座標(雖然有些書上說它們是座標),而指的是到眼睛的平面距離,
left,right分別指的是左右截面到眼睛(在XY平面上)的距離,這兩個數不必一定要對稱,甚至兩個都可以大於或小於0;

 

          對稱
    |-------------|
    |                 |
    |   eye        |
    |                 |
    |-------------|
  left(-1.0)     right(1.0)

====================================================
             不對稱
           |-------------|
           |                 |
  eye   |                 |
           |                 |
           |-------------|
       left(1.0)     right(2.0)

視景體預設情況下,眼睛位置是在座標原點(0.0f,0.0f,0.0f)處,視線指向Z軸的負向。
如果是這種情況,中的left,right的值,就剛好是與它們的全局座標一一對應的。top和bottom也同樣理解。
一種理解方式是這樣:
眼睛是位於座標原點,是逆著Z軸向螢幕裡看的;
gluPerpective,glFrustum函數的zNear, zFar都是相對眼睛的距離,
其各自的負值為相對於座標系原點的座標值;
每個畫的物體,其中心最開始都是位於座標系的原點的,
通過glTranslate, glRotate函數,把物體移動到視景中,這樣物體才可以被看得見;

 

但是事實上,眼睛可以是任何位置,視線也可以不平行於Z軸,這種情況情下,left,right,top,bottom,near,far,
它們指的就只是到眼睛的平面距離,與座標沒有一一對應的關係。

好像越說越複雜了。呵呵。

===============================================
你可以這樣想:在眼睛前面有一個視景台,這個台體並不是固定的,而是隨著你視線的轉動而轉動,
也就是說,視景台的正面和底面始終與視線垂直。那麼,當你的眼睛是在(0,0,0)處,視線是指向Z的負向時,
視景台的近面(0.3)和遠面(0.7)所對應的座標,就是(-0.3,-0.7)
[code]
|Y                 (0.3)                 (0.7)
|                                             |
|0.0                   | -0.3           |-0.7
*eye-------------|--------------|-------> -Z
|                         |                   |
|                                             |
|[/code]再舉個例子,如,眼睛在0.1處,視線指向X軸正向,
那麼視景台也在X軸正向上,近面對應的座標是0.4,遠面對應的座標是0.8
[code]
|Y                  (0.3)            (0.7)
|                                            |
|0.0      0.1       | 0.4            |0.8
-------eye *-----|--------------|------->X
|                        |                   |
|                                            |
|[/code]另外一種理解方式是這樣的:
物體在空間中者有著其固定的位置。物體不被移動,
我們可以通過調整眼睛的位置,和視線的方向,來觀看空間中的所有物體。

================================================
其實這是一個非常主觀性的問題,
主要是看你如何去看待。
也就是說,我們可以設想眼睛不動,只移動空間中的物體。
但是我們也可以設想座標系中的物體不動,我們只移動眼睛,
動作是相對的,但效果是一樣的

對於3DMAX這樣的繪圖軟體就是一種眼睛不動的做法。
但對於遊戲,地形漫遊之類的軟體,則是採用,物體不動,只移動眼睛位置的方法。來類比一個人在地形上走動

=====================================

前面我們說過,視景台是可以不對稱的(這個特性有一些進階應用程式),
但大多的情況下我們還是會定義一下與視線對稱的視景台。於是我們可以使用gluPerpective這個函數。
gluPerpective函數的zNear, zFar都是相對眼睛的(YZ平面)距離,fovy是視野角度。

轉載請保留原文地址:http://www.physdev.com/phpbb/cms_view_article.php?aid=25

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.