close

剛開始學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的畫面

有兩種做法:

  1. 攝影機從(0,0,0)移到(2,0,0)
  2. 整個座標系往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會自動把我們算好的矩陣和目前的相乘

所以要先回到單位矩陣確保你算出來的沒有被變動


四個參數分別是:

  1. angle:視野廣角的角度
  2. ratio:投影布幕width/height的比例
  3. near:最近能看到的距離
  4. far:最遠能看到的距離

這邊要改變攝影機位置

但其實電腦並不會真的改變攝影機位置

而是把整個空間相對位在(0,0,0)的攝影機座變換

所以這裡還是用model matrix

gluLookAt 的參數主要是兩個點座標一個向量


除了上述兩種算矩陣的方法

還有很多function 

glOrtho、glOrtho2D、glTranslatef、glScale、glRotate

都是opengl內建的方法

只要選定要改的矩陣

在下面使用,opengl就會將這個矩陣和原本的相乘


這篇就先寫到這裡

如果英文比較好的可以參考這篇教學

圖文解釋

openGL Matrics


arrow
arrow
    文章標籤
    opengl
    全站熱搜
    創作者介紹
    創作者 Happy Andy 的頭像
    Happy Andy

    Happy Andy 學習筆記

    Happy Andy 發表在 痞客邦 留言(3) 人氣()