OpenGL學習筆記《六》座標系統

  在前面的文章中咱們有了解到,opengl的頂點座標要求是介於-1.0到1.0之間的NDC(標準化設備座標)。可是咱們平常使用到的座標可能有多種不一樣的座標系統,好比針對對象自己有一套座標系統,描述對象內部各個組件的座標關係。對象與對象之間有一套座標系統,描述對象間的座標關係等等。opengl針對不一樣的狀況提供了不一樣的座標系統,而且基於必定的轉換將不一樣座標系統下的座標轉換爲標準化的設備座標(NDC)。spa

  

 

 

   上面這張圖片,描述了在opengl中咱們主要會用到的座標系統,和座標系統的轉換流程。code

LOCAL SPACE,MODEL MATRIXorm

  局部空間,描述的是對象內部的座標系統。好比一張圖片,咱們默認左下角是座標原點(0,0),若是圖片長度爲1,右上角咱們會用(1,1)表述。局部空間座標經過模型矩陣(MODEL MATRIX)轉換爲世界空間座標,模型矩陣的轉換包含對象的位移、旋轉、縮放操做。對象

WORDL SPACE,VIEW MATRIXblog

  世界空間,描述的是對象與對象間的座標關係,好比對象A座標(0,0,0),對象B座標(2,0,0),渲染的時候對象B就會在對象A的左邊,隔着兩個單位。默認每一個對象的世界座標是(0,0,0),若是沒有設置對象的世界座標,那麼渲染效果就是全部的對象都疊在一塊兒了。世界空間座標經過視圖矩陣(VIEW MATRIX)能夠轉換爲視圖空間座標,視圖矩陣主要是經過一系列的旋轉,位移計算,將對象描述到視圖空間內,至關於將對象擺放到咱們眼睛前、攝像機前的合適位置。圖片

  後面視圖空間中會提到攝像機的概念,咱們對攝像機的不一樣操做,如移動、旋轉,也是爲了生成不一樣的視圖矩陣(VIEW MATRIX)it

VIEW SPACE,PROJECTION MATRIXio

  視圖空間,也能夠稱之爲攝像機空間或者視覺空間,描述的是基於用戶眼睛的角度所生成的座標關係。即從咱們的眼睛出發,描述對象是在咱們的前面、左邊、右邊?視圖空間(VIEW SPACE)也至關於攝像機拍攝到的空間。視圖空間座標經過投射矩陣(PROJECTION MATRIX)能夠轉換爲裁剪空間座標,投射矩陣將視圖座標轉換爲-1到1間的標準設備座標(NDC),另外根據投射方式的不一樣能夠分爲正射投影(orthographic projection)和透視投影(perspective projection)。在視覺表現上,透視投影描述的咱們眼睛看到的世界:離咱們近的看的更大,離咱們遠的看的更小;而正射投影則沒有遠近的差別,直接將對象的座標映射到屏幕上而已。form

CLIP SPACEclass

  裁剪空間,描述一個-1到1的座標系統,在這個範圍內的對象會被渲染出來,沒有的就過濾掉。也是在這個空間內,將對象座標最終轉換爲標準化設備座標(NDC)。裁剪空間座標經過視圖轉換,將裁剪空間座標(NDC)裝換爲屏幕空間座標。

SCREEN SPACE

  屏幕空間,即咱們經過glViewport定義的屏幕寬高所對應的座標系統。

  opengl提供多種座標系統,也是爲了方便咱們在不一樣的場景下有合適的座標體系,在不一樣場景下有方便的轉換方式。而咱們常見到的MVP轉換,就是從對象空間裝換到裁剪空間的組合。另外咱們以前也瞭解過,頂點着色器主要處理的是對象頂點的座標,因此咱們的MVP轉換也是在頂點着色器內處理。

  以經常使用的透視投影爲例,咱們描述一個在咱們眼睛前面3個單位,右邊1個單位對象的MVP矩陣轉換過程

// model matrix
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f);
// view matrix
glm::mat4 view = glm::mat4(1.0f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f);
// projection matrix
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
// 傳遞給shader
// u_model = model; u_view = view; u_projection = projection;
...
... vertex shader
uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;
void main(){
    gl_Position = u_projection * u_view * u_model * vec4(aPos, 1.0f);  
}

  模型矩陣咱們提到了是對象位移、旋轉、縮放操做的轉換;視圖矩陣咱們能夠引入攝像機概念進行更爲複雜的效果表現;投射矩陣比較固定,設定哪一種投射方式,屏幕的寬高,遠近參數的設定等。

相關文章
相關標籤/搜索