OpenGL函式思考 gluPerspective

2021-08-26 16:28:22 字數 1483 閱讀 3943

opengl函式思考-gluperspective

函式原型:

void gluperspective(gldouble fovy, gldouble aspect,gldouble znear,gldouble zfar)

引數說明:

fovy:指定視景體的視野的角度,以度數為單位,y軸的上下方向

aspect:指定你的視景體的寬高比(x 平面上)

znear: 指定觀察者到視景體的最近的裁剪面的距離(必須為正數)

zfar: 指定觀察者到視景體的最遠的裁剪面的距離(必須為正數) 如圖

函式說明:

gluperspective()這個函式設定透視投影矩陣,一般在執行命令glmatrixmode(gl_projection)和glloadidentity()之後使用;它指定了觀察的視景體在世界座標系中的具體大小,一般而言,其中的引數aspect應該與視窗的寬高比大小相同。比如說,aspect=2.0表示在觀察者的角度中物體的寬度是高度的兩倍,在視口中寬度也是高度的兩倍,這樣顯示出的物體才不會被扭曲

由gluperspective()產生的矩陣是當前矩陣與指定的矩陣相乘得到的,就好像是呼叫glmatrix()產生的矩陣一樣。為了使透視矩陣替代當前矩陣,在呼叫gluperspective()之前要先呼叫glloadidentity()這個函式(就是把當前矩陣重置為單位矩陣)。

透視原理:

我們知道,遠處的東西看起來要小一些,近處的東西看起來會大一些,這就是透視原理,如下圖所示

假設那兩條線表示公路,理論上講,它們的兩條邊是平行的, 但現實情況中,它們在遠方(可以無限遠)總要相交於一點,實際線段ab的長度=cd的長度,只是在此例中使用了透視角,故會有如上的效果,是不是很接近現實的情況?

結合gluperspective()這個命令:

znear,眼睛距離近處的距離,假設為10公尺遠,請不要設定為負值,opengl就傻了,不知道怎麼算了,

zfar表示遠處的裁面,假設為1000公尺遠,

就是這兩個引數的意義了,

再解釋下那個"眼睛睜開的角度"是什麼意思,首先假設我們現在距離物體有50個單位距離遠的位置, 在眼睛睜開角度設定為45時,請看大螢幕:

我們可以看到,在遠處乙個球,很好玩哈,現在我們將眼睛再張開點看,將"眼睛睜開的角度"設定為178(180度表示平角,那時候我們將什麼也看不到,眼睛睜太大了,眼大無神),我們只看到乙個點,因為我們看的範圍太大了,這個球本身大小沒有改變,但是它在我們的"視界"內太小了;

反之,我們將眼睛閉小些,改為1度看看會出現什麼情況呢?在我們距離該物體3000距離遠,"眼睛睜開的角度"為1時,我們似乎走進了這個球內,這個是不是類似於相機的焦距?

當我們將"透視角"設定為0時,我們相當於閉上雙眼,這個世界清靜了,我們什麼也看不到。

OpenGL函式思考 gluLookAt

opengl函式思考 glulookat 函式原型 void glulookat gldouble eyex,gldouble eyey,gldouble eyez,gldouble centerx,gldouble centery,gldouble centerz,gldouble upx,gld...

OpenGL函式思考 glBlendFunc

opengl函式思考 glblendfunc 函式原型 void glblendfunc glenum sfactor,glenum dfactor 引數說明 函式說明 在rgb模式下,可以使用把引入的rgba值 源 與幀快取中的rgba值 目標 相融合的融合函式來繪製畫素。預設時,融合是關閉的,可...

OpenGL函式思考 glLoadIdentity

函式原型 void glloadidentity void 函式說明 opengl為我們提供了乙個非常簡單的恢復初始座標系的手段,那就是呼叫glloadidentity 命令。該命令是乙個無參的無值函式,其功能是用乙個4 4的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。也就是說,無論以前...