矩陣-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軸旋轉

          

縮放變換

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM