Linux OpenGL 實踐篇 4 座標系統

2022-08-24 10:18:13 字數 2401 閱讀 9221

opengl中頂點經過頂點著色器後會變為標準裝置座標系。標準裝置座標系的各座標的取值範圍是[-1,1],超過這個範圍的點將會被剔除。而這個變換的過程可描述為頂點在幾個座標系統的變換,這幾個座標系統為:

模型空間(local sapce)

世界空間(world space)

觀察空間(view space)

裁切空間(clip space)

螢幕空間(projection space)

下面我們對幾個空間做乙個詳細的解釋:  

表示模型最初所在的空間,即當時構建這個模型時的座標空間。比如上一節中繪製三角形時所給的三個頂點的座標就時模型座標系下的座標位置,每乙個x,y,z的取值範圍都是[-1,1]。 

世界座標系描述的時所有三維模型的相對關係。

想象一下,我們構造模型的時候通常是乙個乙個的構建的,每個模型都是相對模型座標系的(0,0,0)點進行的建模,這個時候如果我們把這些模型都放在一起,可以想象它們將疊在一起,這個當然不是我們想要的,這個時候就需要另乙個座標系來描述它們的方位關係了。比如場景中有乙個人和一輛車,它們在構建時都在(0,0,0)點,現在我們在這個基礎上把人放在(-2,0,0)的位置,把車放在(10,0,0)的位置,而這個座標就是世界空間中的座標。  

以攝像機在世界座標系中的位置和方向構建的座標系,即把世界座標系按攝像機的位置和方向變換。

觀察空間可以這麼理解:在世界空間擺放好我們的模型之後,我們需要找乙個位置和角度來觀察它們,我們觀察到的畫面即我們要渲染的畫面,而以我們眼睛為基點構建的空間即為觀察空間。觀察空間是把世界空間的點轉換為視線前方的點的而產生的結果。它通常由一些平移和旋轉矩陣組合成。

我們人眼的觀察範圍是有限的,計算機模擬人眼視野,所以opengl渲染的頂點應該都在乙個視野範圍內,這個視野範圍即我們所謂的裁切空間,超出這個範圍的點就被裁切掉。裁切空間定義在標準裝置座標系上的,座標的取值範圍是(-1,1),但我們觀察空間中的頂點是三維的,如果要把三維的頂點對映為二維的點,我們需要定義乙個投影矩陣把觀察空間的點對映到裁切空間。

投影就是將三維物體投射到二維平面的過程,投影可分為正投影透視投影

正投影比較簡單,他的平截頭體是乙個長方體,在這個長方體內的頂點可見,其它點則剔除。這個長方體可以由left,right,bottom,top,near,far這幾個引數確定,其中near和far表示近平面和遠平面。投影可以看作是把三維畫面投影在近平面,可以想象,因為遠平面和近平面一樣大,所以投影對於物體的大小沒有影響,可以推斷:在著色器使用齊次座標,頂點著色器透視除法所使用的w為1,即(x/w,y/w,z/w,1),w=1。

在實際生活中常見的現象是離我們越遠的物體越小,越近的物體越大。這個效果就是透視,最直觀的現象即使兩條平行線在遠處會相交,如鐵路上的鐵軌。要實現這種透視的效果我們需要乙個梯狀的平截頭體,這個平截頭體的引數定義可同正投影使用6個引數,也可使用指定fov的方式定義。與正投影相比,透視投影的遠平面更大,這樣越遠的物體投影到近平面時就越小,即w是乙個與z相關的值。

具體的投影矩陣推導可參見:這裡;

螢幕空間可理解為顯示器螢幕上定義的座標空間,有兩種定義,一種是以左上角為(0,0)點,右下角為(width,height),其中width和height是螢幕的寬和高;一種是左下角為(0,0)點,右上角為(width,height)。

mvp即我們常用的把座標從模型座標系變換到投影座標系的矩陣,其中m表示model,v表示view,p表示projection。根據前文表述,我們有4個座標系(螢幕座標系統除外),其中有三個變化,分別是:模型空間->世界空間,世界空間->觀察空間,觀察空間->裁切空間,把這3個變化矩陣組合到一起即為模型空間到裁切空間的矩陣變換——mvp:

vclip=

mpro

ject

ion⋅

mvie

w⋅mm

odel

⋅vlo

cal'>

為什麼要分這麼多個階段的變化?為什麼會有這麼幾個座標系空間?

這些座標系空間都是我們理解這個三維的世界時所提煉出來的概念,比如攝像機模擬的就是人的眼睛,世界座標系則可以對標我們現實的大世界。對於這些空間座標系劃分和梳理,能夠讓我們直觀的計算機繪製三維世界的過程,同時結合矩陣的應用,我們能夠根據我們的目的選擇合適的座標系空間來操作,比如在進行物體移動的時候,使用世界座標系會比較的方便,計算光照或投影時,在攝像機空間可能更為方便。vc

lip=

mpro

ject

ion⋅

mvie

w⋅mm

odel

⋅vlo

cal'>的發達第

Linux OpenGL 實踐篇 16 文字繪製

本文主要射擊freetype的入門理解和在opengl中實現文字的渲染。opengl本身並沒有提供文字繪製功能,通常有兩種方式來繪製文字,使用freetype繪製文字屬於紋理字型的方式,這種繪製方式的好處就是靈活,擴充套件性強,比如你想把文字繪製在乙個飄動的紅旗上,用顯示列表的方式就很難實現 dem...

指標實踐 4

利用指標陣列的便捷之處 示例 阿拉伯數字翻譯成羅馬數字 在之前部落格提過,但當時未曾接觸指標,今天再次拿出來細品 include include intmain int n,t,i,m printf please input number scanf d n printf output n if n...

線性回歸 實踐篇

總結了線性回歸的理論部分,下面我們以浦東塘橋的二手房資料來實踐線性回歸。1,資料獲取 2,資料過濾 爬到資料後,過濾了房間面積小於30平公尺,大於150平公尺的資料,總 大於800w的也過濾了。這些資料太小或者太大 3,一元線性回歸 x表示房子面積,y表示房價,使用正規方程組的方法計算。拿到 後執行...