OpenGL函式思考 gluLookAt

2021-06-20 19:06:30 字數 1691 閱讀 6534

函式原型:

void glulookat(gldouble eyex,gldouble eyey,gldouble eyez,gldouble centerx,gldouble centery,gldouble centerz,gldouble upx,gldouble upy,gldouble upz)

引數說明:

eyex, eyey,eyez 指定視點的位置

centerx,centery,centerz 指定參考點的位置

upx,upy,upz 指定視點向上的方向

函式說明:

glulookat()這個函式指定乙個檢視矩陣,一般在執行命令glmatrixmode(gl_modelview)和glloadidentity()之後使用;該函式定義了視點矩陣,並用該矩陣乘以當前矩陣。eyex、eyey、eyez定義了視點的位置;centerx、centery和centerz變數指定了參考點的位置,該點通常為相機所瞄準的場景中心軸線上的點;upx、upy、upz變數指定了向上向量的方向。

通常,視點轉換操作在模型轉換操作之後發出,以便模型轉換先對物體發生作用。場景中物體的頂點經過模型轉換之後移動到所希望的位置,然後再對場景進行視點定位等操作。模型轉換和視點轉換共同構成模型視景矩陣。

這個函式是對模型矩陣進行變換(gl_modelview),而gluperspective函式是對投影矩陣進行變換(gl_projection),這一點一定要搞清楚。在實際應用時,可以用gluperspective函式設定近平面、遠平面。

透視原理:

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

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

結合glulookat()這個命令:

它共接受三對座標, 分別為

eye,center,up,

eye:     表示我們眼睛在"世界座標系"中的位置,

center:表示眼睛"看"的那個點的座標,

up:      表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那麼這個up則表示我們是正立還是倒立異或某乙個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那麼x,z軸為0,y軸為正即可,通常將其設定為1,只要表示乙個向上的向量(方向)即可。

球是畫在世界座標系的原點上的,即o(0,0,0)座標上,我們的眼睛位於觀察點a(0,0,100),z軸向螢幕裡看去的方向為負,螢幕外我們的位置,z軸為正值,其實很好理解,即我們距離原點的距離,設定100,將觀察到如下圖所示的影像

如果我們向前或向後移動,則相應的影象會變大或變小,這裡其實就是運用了透視原理,近處的物體大,遠處的物體小,實際物體的大小是不變的,同理改變center座標(眼睛看去的那個點,可簡單理解為視線的終點)也會影響球的大小,同樣可以認為是改變了物體與觀察點的距離所致,最後那個up座標表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那麼這個up則表示我們是正立還是倒立異或某乙個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那麼x,z軸為0,y軸為正即可,通常將其設定為1,只要表示乙個向上的向量(方向)即可,我們指定0.1f或0.00001f異或1000.0f,效果是一樣的,只要能表示方向即可。

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的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。也就是說,無論以前...