現實中的三維物體要畫到紙上,二維平面畫圖,就是點和線,三維是點線面,需要把三維的每個位置的空間座標(x,y,z)對映到二維平面座標(x,y),這可以通過線性代數知識解決。
opengl通過各種變換實現,都是矩陣運算實現的
幾種變換簡介(參見opengl超級寶典第5章)
變換用途
檢視指定觀察點的位置
模型在場景中移動,縮放,選擇物件
模型檢視
描述檢視變換和模型變換的對偶性
投影對可見空間進行剪裁和改變大小
視見區對視窗的最終輸出進行縮放
參考
void glpushmatrix(void);
該函式表示將所有矩陣依次壓入堆疊中,頂部矩陣是第二個矩陣的備份;壓入的矩陣數不能太多,否則出錯。
另一種理解:複製當前桟頂,並把複製內容再次放到桟頂,以保護桟上之前的內容
void glpopmatrix(void);
該函式表示彈出堆疊頂部的矩陣,令原第二個矩陣成為頂部矩陣,接受當前操作,故原頂部矩陣被破壞;當堆疊中僅存乙個矩陣時,不能進行彈出操作,否則出錯。
mode 告訴計算機哪乙個矩陣堆疊將是下面矩陣操作的目標,即將什麼矩陣設定為當前矩陣,他的可選值有: gl_modelview、gl_projection、gl_texture.
參考 opengl為我們提供了乙個非常簡單的恢復初始座標系的手段,那就是呼叫glloadidentity()命令。該命令是乙個無參的無值函式,其功能是用乙個4×4的單位矩陣來替換當前矩陣,實際上就是對當前矩陣進行初始化。也就是說,無論以前進行了多少次矩陣變換,在該命令執行後,當前矩陣均恢復成乙個單位矩陣,即相當於沒有進行任何矩陣變換狀態。
當呼叫glloadidentity()之後,實際上將當前點移到了螢幕中心:類似於乙個復位操作
x座標軸從左至右,y座標軸從下至上,z座標軸從裡至外。
opengl螢幕中心的座標值是x和y軸上的0.0f點。
中心左面的座標值是負值,右面是正值。
移向螢幕頂端是正值,移向螢幕底端是負值。
移入螢幕深處是負值,移出螢幕則是正值。
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 相機向上的方向在世界座標中的方向
你把相機想象成為你自己的腦袋:
第一組資料就是腦袋的位置
第二組資料就是眼睛看的物體的位置
第三組就是頭頂朝向的方向(因為你可以歪著頭看同乙個物體)。
參考:
把視景體擷取的影象按照怎樣的高和寬顯示到螢幕上
參考
三維座標轉換為二維座標
最近做專案用到三維座標轉換為二維平面座標的轉換公式。看了網上的很多資料,都不太適用自己的專案。最後決定自己來推導。如下圖所示,將二維平面上的三維座標系o x y z 轉換為二維座標系o xy。利用推導出的公式,在二維平面上繪製出三維立體圖。假設在三維座標系中有一點a x y z 轉換為二維座標系中的...
二維與三維座標變換
left begin x y 1 end right left begin x t x y t y 1 end right left begin 1 0 t x 0 1 t y 0 0 1 end right left begin x y 1 end right left begin x y 1 e...
OpenGL 螢幕二維座標轉化為三維模型座標
我們把opengl裡模型的三維座標往二維座標的轉化稱為投影,則螢幕上的二維座標往三維座標轉化則可以稱為反投影,下面我們來介紹一下反投影的方法。主要是gluunproject函式的使用,下面是 cpp view plain copy void screen2glpoint 注 x,y 是螢幕座標,wi...