矩陣-DirectX與OpenGL的不同

小 樓 一 夜 聽 春 雨發表於2014-05-29

http://www.cnblogs.com/graphics/archive/2012/08/02/2616017.html

矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫DirectX和OpenGL對矩陣操作卻有著細微的差別,大多數的圖形學書籍都以OpenGL為基礎進行闡述,遊戲程式設計類的書籍則更多使用DirectX,這就難免產生混淆,今天這篇主要講講兩者在操作矩陣的時候有何不同。

 

矩陣

 

在三維圖形學中,一般使用四維矩陣,也就是四行四列的方陣,下面是一個典型的四維矩陣

既然是三維圖形學,為什麼使用四維矩陣呢?主要有兩個原因,第一,為了平移變換,第二,為了區別點和向量。

 

行向量與列向量

 

對於一個四維向量,它是行向量還是列向量呢?DirectX使用行向量,如下。

而OpenGL則使用列向量,如下

或者寫成

 

矩陣與向量相乘

 

頂點進行幾何變換的過程,從數學層面講,就是頂點和矩陣相乘產生新頂點的過程,那麼向量與矩陣相乘時順序是怎樣的呢?這取決於該向量是行向量還是列向量,我們知道兩個矩陣Aij和Bxy若能相乘,則必須滿足j=x才行,也就是說左邊矩陣的列數要等於右邊矩陣的行數,由於行向量和列向量本質上也是矩陣,也滿足矩陣乘法的規律。

在DirectX中,使用行向量,所以向量和矩陣相乘的時候,向量在左,矩陣在右,如下。

而OpenGL中則使用列向量,相乘的時候矩陣在左,向量在右,如下。

比如對於平移變換來說,如果使用DirectX,那麼m41,m42,m43分別對應三個平移分量,對應下面的Tx,Ty和Tz。

如果使用OpenGL,那麼m11,m21,m31分別對應三個平移分量。

可以看出,對於同一個變換,DirectX中的矩陣和OpenGL中的矩陣互為轉置矩陣。

 

矩陣連乘

 

如果有多個變換作用於一個頂點,那麼可以先將所有的變換矩陣相乘,得到一個變換矩陣,最後將這個變換矩陣應用到頂點即可,這就涉及到矩陣的連乘,這時候如何安排矩陣的先後順序呢?假設現在有三個變換,分別是平移變換,對應矩陣T,旋轉變換,對應矩陣R,縮放變換,對應矩陣S,順序是先平移,再旋轉,後縮放,那麼這個矩陣乘法該如何去寫呢?

在DirectX中,矩陣乘法的順序是從左到右,變換生效的先後順序也是從左到右

而在OpenGL中,矩陣連乘的順序是從右到左

不管是哪種方式,都是先產生作用的矩陣離頂點近(上面的T),後產生作用的矩陣離頂點遠(上面的S)。

 

一個誤區,左手系與右手系

 

矩陣乘法的順序與座標系是左手系還是右手繫有關係麼?根本沒啥關係!

 

常用變換矩陣

 

下面給出幾種常用的變換在DirectX和OpenGL中對應的矩陣,下圖中左面是DirectX中的矩陣,右面是OpenGL中的矩陣。

 

平移變換

 

          

 

繞X軸旋轉

 

          

 

繞Y軸旋轉

 

          

 

繞Z軸旋轉

 

          

 

縮放變換

 

一致,因為縮放變換的變換因子都在矩陣的對角線上,所以轉置矩陣等於其自身。

相關文章