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