剛開始學opengl的時候
在網路上找了一堆範例程式
每個程式劈頭就出現一堆matrix mode、GL_PROJECTION、GL_MODELVIEW等等的東西
都直接當作沒看到往下滑
但是當我要開始畫東西在opengl上的時候又會出現很多難以解釋得現象
這時才把目光移到上面這一坨東西,開始好好查資料啦
下面講解opengl是怎麼用矩陣建構出這個3D空間
openGL 3D 空間
Model,View,Projection matrix是三種不同的矩陣。
Model matrix 將模型自己的座標系對應到空間座標系
View matrix 將空間座標系對應到攝影機所看到的座標系
Projection matrix 將攝影機所看到的座標系對應到螢幕呈現出來的2D座標系
openGL的3D空間中有幾個重要的角色,物體、空間、攝影機和電腦螢幕
物體就是Model
一個model是由很多個vertex所組成的
而這些vertex就必須要定義出各自的座標
才能畫出最後的物體
因此Model有自己的座標系,原點就是物體的中心。
以一個邊長是2的立方體來說中心在原點
其他八個點就是(1,1,1)(1,-1,1)(-1,-1,1)(-1,1,1)(1,1,0)(1,-1,0)(-1,-1,0)(-1,1,0)
但是當這個物體的中心在空間的座標系的(0,0,2)上的時候,所有點都要往上平移2
而這個平移的動作就是 Model Matrix
他的功能就是將所有vertex從model座標系轉到空間座標系
再來第三個角色出現了
就是我們用攝影機觀察這個世界
這個時候物體的位置就跟攝影機所在的位置有關係了
假設攝影機在(0,0,0)的位置朝剛剛平移過後的立方體看過去
如果我們想要看到我們往x方向移動2的畫面
有兩種做法:
- 攝影機從(0,0,0)移到(2,0,0)
- 整個座標系往x方向移動-2
opengl用的是第二種方式,這對電腦來說比較簡單
而這個隨著攝影機位置而改變座標的動作就是View Matrix
他的功能就是將空間座標隨著我們的觀察位置、方向做轉換
最後,雖然是3D空間
但是最後畫面會呈現在2D的螢幕上
所以這個時候就需要做第三個轉換
將3D投影到2D座標也就是 Projection Matrix
他的功能就是將3D座標投影的2D座標上
這個轉換會讓你的畫面有透視感,也就是兩條平行線最在無線遠相交的感覺
整個流程就是這樣
Model coordinate
Model matrix
World coordinate
View matrix
Camera coordinate
Projection matrix
Projection coordinate
也就是說我們最後在螢幕上看到的座標
就是model座鰾乘上M*V*P 矩陣得到的結果
所以想要做任何畫面或model的座標改變
只要改這三個矩陣就可以了~~~~
現在就來解釋剛剛的code吧!!!
想要改矩陣之前,最好都先經過glLoadIdentity()
因為opengl會自動把我們算好的矩陣和目前的相乘
所以要先回到單位矩陣確保你算出來的沒有被變動
四個參數分別是:
- angle:視野廣角的角度
- ratio:投影布幕width/height的比例
- near:最近能看到的距離
- far:最遠能看到的距離
這邊要改變攝影機位置
但其實電腦並不會真的改變攝影機位置
而是把整個空間相對位在(0,0,0)的攝影機座變換
所以這裡還是用model matrix
gluLookAt 的參數主要是兩個點座標一個向量
除了上述兩種算矩陣的方法
還有很多function
glOrtho、glOrtho2D、glTranslatef、glScale、glRotate
都是opengl內建的方法
只要選定要改的矩陣
在下面使用,opengl就會將這個矩陣和原本的相乘
這篇就先寫到這裡
如果英文比較好的可以參考這篇教學
圖文解釋
留言列表