2014-09-01 117 views
1

正如我們所知,OpenGL維護映射點的模型視圖和投影矩陣。初學者對模型到世界座標映射的困惑

如果仔細觀察,我把模型視圖矩陣: MAT4模型視圖= WorldViewMtx * ModelWorldMtx

好,什麼我不明白是怎麼ModelWorldMtx算出來

例如,如果我們有模型corrdinates(MC)和世界座標(WC)在2D中,如下示: MC And WC

在MC一個點= [1; 1; 1](在均相列向量座標,我表示它的像馬的方式tlab)中,映射到WC的是b = M a = [ - 1 0 4; 0 1 3; 0 0 1] [1; 1] = [3; 4; 1]兩個座標之間的轉換矩陣(我的意思是兩個座標的基矢量之間的關係矩陣)。

如果我們在2D風格中應用gltranslate(1.0,0.0,0.0),那麼平移矩陣是T = [1 0 1.0; 0 1 0.0; 0 0 1]。因此,在這種方式指向映射到WC遺囑:

B」 = M Ť A = [ - 1 0 4 0 1 3 0 0 1] [1 0 1.0 0 1 0.0 0 0 1] [1; 1; 1] = [2; 4; 1]。

那麼在這個例子中,ModelWorldMtx究竟是什麼?

我認爲,仿射變換功能,如glTranslate,glScale只是工作在模型coordinates.If MC和WC在這種情況下不重合,

所以ModelWorldMtx = M T = [ - 1 0 4 ; 0 1 3; 0 0 1] [1 0 1.0; 0 1 0.0; 0 0 1] = [-1 0 3; 0 1 3; 0 0 1]。

如果MC和WC在OpenGL中重合,轉換矩陣M是一個單位矩陣,所以ModelWorldMtx = T,也就是說在調用gltranslate後該點被映射到WC。

我對不對?

+0

究竟是什麼問題? 「那麼在這個例子中,ModelWorldMtx究竟是什麼?」無論你如何定義它。你只是做了2個轉換的組合,並得到了應該預期的結果。但我不明白你在問什麼。 – derhass 2014-09-01 19:33:53

回答

0

正如我們所知,OpenGL維護映射點的模型視圖和投影矩陣。

其實從OpenGL-3來看,它並沒有。內建的矩陣堆棧已被棄用,並從OpenGL-3.3核心及以後的版本中刪除。

如果仔細觀察,我把模型視圖矩陣:

mat4 modelview = WorldViewMtx * ModelWorldMtx 

不,模型視圖矩陣只是

mat4 modelview 

它不分成子矩陣自然。當然,你可以通過連續乘以多個矩陣來構成一個均勻變換矩陣,但結果就是一個單一的矩陣。

當調用glTranslate,glScale或類似函數時,它們實際上會將該矩陣與平移,縮放或此類矩陣相乘的結果替換爲當前的M.

對嗎?

不完全。你主要是在推翻這一點。舊的固定功能OpenGL流水線中的轉換過程是

pos_view = M · pos_local 
pos_clip = P · pos_view 

pos_clip'_0…1 = clip(pos_clip_0…1) 

pos_NDC = pos_clip'/pos_clip.w 

就是這樣。沒有什麼更奇特的了。 OpenGL很愚蠢。當然,這些日子裏,我們正在用着色器做所有事情,上面的段中的前兩行可以是任何可以用圖靈語言表達的東西。