OpenGL中所有的變換,都是在變換座標系。

2021-06-08 18:21:11 字數 1586 閱讀 3164

首先明確一點,我們在程式中,opengl的變換的**是從上往下寫的,但實際變換是從下往上進行的。在空間(座標系)中的變換也是從下往上依次是:模型空間->世界空間->視覺空間->裁剪空間--->螢幕。

再利用opengl 進行3d繪製時,就會使用笛卡爾座標系,如果不進行任何座標變換,使用的座標系和視覺座標系相同

世界座標:物體進行模型變換後,便進入了世界空間,在這裡可以對物體進行模型變換,各個物體之間的相互位置關係也在這裡確定

1。檢視變換:檢視變換是應用到場景中的第一種變換,移動了當前的工作座標系,允許我們把觀察點放在我們希望的任何位置,所有後續變換都會基於新調整的座標系進行。

2。模型變換:用於操縱模型和其中的特定物件,有旋轉、平移、縮放,旋轉平移連續使用時每次變換都與最後的變換結果有關,先平移後旋轉和先旋轉後平移的結果往往不同。模型變換講物體變換到世界空間中,在世界空調間中進行移動旋轉和縮放的變換,這些變換都可以看成在移動世界座標系

例如gltranslatef(10,0,0);可以看成是將世界座標系左移了10個單位,然後進行繪製。

3。模型檢視:把上述兩者變換進行組合,成為乙個單獨的矩陣,即模型檢視矩陣,如果直接進行檢視模型變換,載入檢視模型矩陣,那麼我們就省略跳過世界座標系,直接進入到視覺座標系中,在變換中我們經常直接載入檢視模型矩陣:

glmatrixmode(gl_modelview);

glloadidentity(); 

這樣其實得到的座標已經是視覺座標系的座標了,不是世界座標系中的,這點要牢記。

在這之後可以進行glulookat()函式操作(記住實際是從下往上)

glulookat(eye,look,up);

glmatrixmode(gl_modelview);

glloadidentity();  

gltranslatef(10,0,0); 

glscalef(a,a,a); 

glrotatef(θ, 0,0,1) 

drawobject() ;

4。投影變換:定義視景體並建立了裁剪平面,制定乙個完成的場景如何投影到螢幕上的最終影象,有正投影和透視投影兩種

5。視口變換:上述變換後得到乙個場景的二位投影,用視口變換對映到螢幕某處的物理視窗上。這裡其實是硬體的事情,opengl的事情只到投影變換,乙個場景就算繪製完成了。

glviewport(0,0,width,height);

//設定視口(視窗)大小

glmatrixmode(gl_projection));  

glloadidentity(); 

gluperspective(fov,aspect,near,far);

glulookat(eye,look,up); 

glmatrixmode(gl_modelview); 

glloadidentity();   

gltranslatef(10,0,0);  

glscalef(a,a,a);  

glrotatef(θ, 0,0,1)  

drawobject() ;

C 中所有的符號

算術運算子 加 x y z 減 x y z 乘 x y z 除 x y z 賦值運算子 賦值 x 10 賦值與和 x 10 等於x x 10 賦值與減 x 10 賦值與乘 x 10 賦值與除 x 10 賦值位與 x 0x02 賦值位或 x 0x02 邏輯操作符 邏輯與 if x 0xff 邏輯或 i...

所有的小事都是大事

前幾天紀老師給我們提醒了一件可以說很不起眼的小事,但是我覺得如果把每一件小事都做好,以後大事還能做不好嘛?當老師說窗戶開著咱們就把紗窗關上,乙個是防止蚊蟲叮咬我們,讓我們覺得不舒服 另乙個是如果咱們不注意窗戶開沒開著,有同學想開空調,咱們就會造成浪費,既不節源也不環保。這雖然是一件小事,但是我覺得這...

檢視域中所有的使用者

前言 我們在新增域使用者時,有時會有使用者沒有新增,或者已新增的使用者名稱拼寫錯誤。這時,我們想查一下目前域中所有的使用者,使用如下命令。net user domain 其他一些命令 查詢域管理員使用者 net group domain admins domain 查詢域使用者 net user d...