矩陣-DirectX與OpenGL的不同

矩陣-DirectX與OpenGL的不同

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

矩陣

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

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

行向量與列向量

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

而OpenGL則使用列向量,如下

或者寫成

矩陣與向量相乘

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

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

而OpenGL中則使用列向量,相乘的時候矩陣在左,向量在右,如下。注意矩陣乘法中,若用^表示轉置,則(AB)^=B^A^,所以下面的矩陣與DirectX中的矩陣互爲轉置矩陣,感謝網友ello指點。

比如對於平移變換來說,如果使用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軸旋轉

          

縮放變換

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章