OpenGL 二. 坐標系基礎(chǔ)概念
2D笛卡爾坐標
平面坐標系
3D笛卡爾坐標
我們可以用3個坐標(X,Y,Z)來指定三維空間中的一個位置.
視口
- 窗口是以像素為單位度量. 在開始在窗口中繪制點,線,形狀之前,必須告訴OpenGL 如何把指定坐標映射為屏幕坐標.
- 坐標系統(tǒng)必須從邏輯笛卡爾坐標映射到物理屏幕像素坐標. 這個映射是通過一種叫做視口(
viewPort)的設(shè)置來指定.笛卡爾坐標系和屏幕設(shè)備的坐標系,并不是完全一一對應(yīng)的。 - 在我們代碼中,我們會通過
glViewPort函數(shù)來實現(xiàn)視口的設(shè)計. 視口就是窗口內(nèi)部用于繪制裁剪區(qū)域的客戶區(qū)域. - 一個屏幕區(qū)域可以用來,展示不同的信息。
投影:從3D到2D
- 不管我們覺得自己的眼睛看到的三維立體圖像多么真實.屏幕上像素實際上只有二維的. 我們的手機屏幕本身就是二維的,我們是無法真實去呈現(xiàn)立體圖形.
- 那么OpenGL 是如何將笛卡爾坐標系映射成可以在屏幕上顯示的二維坐標的?
在這里需要用到投影.我們需要指定投影空間,指定在窗口顯示的視景體(Viewing Volume).并指定如何對它進行變換. - 類比于照鏡子和照相機照的照片。3D映射為2D。
投影方式
第一種正投影(Orthographics Projection)或平行投影
平行光投射。
需要指定一個正方形/長方形的視景體.因為距離遠近投影大小一樣.所以常用于,工程作業(yè)。-
第二種透視投影(Perspective Projection)
點光源投射。
需要指定視景體的.而這個視景體看起來像平截體. 透視投影一般會使用于3D圖像渲染投影方式
左手系,右手系
-
OpenGL中坐標系中的物體、世界、照相機坐標系都屬于右手坐標系,而規(guī)范化設(shè)備坐標系使用左手坐標系。便于在坐標系世界中確定正方向?;\統(tǒng)地說OpenGL使用右手坐標系是不合適的。
左手系,右手系
坐標系
將坐標變換為標準化設(shè)備坐標,接著再轉(zhuǎn)化為屏幕坐標的過程通常是分步進行的。物體的頂點在最終轉(zhuǎn)化為屏幕坐標之前還會被變換到多個坐標系統(tǒng)(Coordinate System)。比較重要的有:
-
局部空間(Local Space,或者稱為物體空間(Object Space))
-
世界空間(World Space)
-
觀察空間(View Space,或者稱為視覺空間(Eye Space))
-
裁剪空間(Clip Space)
-
屏幕空間(Screen Space)
從頂點轉(zhuǎn)化為片段之前需要經(jīng)歷不同狀態(tài),為了將坐標系轉(zhuǎn)到另一個坐標系。我們需要幾個變換矩陣.
模型(Model)、觀察(View)、投影(Projection) 三個矩陣
3D圖形學(xué)中常用坐標系:
-
世界坐標系
- 世界坐標系是系統(tǒng)的絕對坐標系,在沒有建立用戶坐標系之前畫面上所有的點的坐標都可以在該坐標系的原點來確定各自的位置.世界坐標系始終是固定不變的
-
物體坐標系
- 每個物體都有他們獨立的坐標系.當(dāng)物理移動或者改變方向時.該物體相關(guān)聯(lián)的坐標系將隨之移動或改變方向。
- 比如說,當(dāng)你開車時,有人會說向左轉(zhuǎn),有人說向東。但是,向左轉(zhuǎn)是物體坐標系的概念,而向東則是世界坐標系中的
- 我們可以理解物體坐標系為模型坐標系。因為模型頂點的坐標都是在模型坐標系中描述的
-
攝像機坐標系
- 在坐標系的范疇里,攝像機坐標系和照相機坐標系都是一樣的意義。照相機坐標系是和觀察者密切相關(guān)的坐標系。照相機坐標系和屏幕坐標系相似,差別在于照相機坐標系處于3D空間中,而屏幕坐標系在2D平面里。
-
照相機可以站在三維空間,觀察物體.
攝像機坐標系
-
慣性坐標系
-
指的是世界坐標系到物體坐標系的"半途". 慣性坐標系的原點和物體坐標原點重合,但慣性坐標系的軸平行于世界坐標系的軸.
慣性坐標系
因為物體坐標系轉(zhuǎn)換到慣性坐標系只需要旋轉(zhuǎn),從慣性坐標系轉(zhuǎn)換到世界坐標系只需要平移.慣性坐標系便于理解,和操作坐標系變換.
-
OpenGL 二. 坐標系轉(zhuǎn)換
坐標變換的全局圖

坐標變換的全局圖
- 注意,OpenGL只定義了裁剪坐標系、規(guī)范化設(shè)備坐標系和屏幕坐標系,而局部坐標系(模型坐標系)、世界坐標系和照相機坐標系都是為了方便用戶設(shè)計而自定義的坐標系,它們的關(guān)系如下圖所示
關(guān)系圖圖中左邊的過程包括模型變換、視變換,投影變換,這些變換可以由用戶根據(jù)需要自行指定,這些內(nèi)容在頂點著色器中完成;
圖中右邊的兩個步驟,包括透視除法、視口變換,這兩個步驟是OpenGL自動執(zhí)行的,在頂點著色器處理后的階段完成。
補充一: 視變換圖示
- 相對應(yīng)與MVP中的V,把世界坐標,轉(zhuǎn)化為觀察者坐標
alt
補充二: 坐標轉(zhuǎn)換計算簡易圖示
- 主要介紹了 頂點的MVP變換大概流程
alt
補充三: 坐標轉(zhuǎn)換矩陣計算
-
OpenGL然后對裁剪坐標執(zhí)行透視除法從而將它們變換到標準化設(shè)備坐標。OpenGL會使用glViewPort內(nèi)部的參數(shù)來將標準化設(shè)備坐標映射到屏幕坐標,每個坐標都關(guān)聯(lián)了一個屏幕上的點。這個過程稱為視口變換
alt
上式子表示了,坐標經(jīng)過MVP矩陣變換轉(zhuǎn)換為裁剪坐標,后續(xù)坐標變換都由OpenGL自動完成







