矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫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中的矩陣。
縮放變換矩陣,兩者是一致的,因為縮放變換的變換因子都在矩陣的對角線上,所以轉置矩陣等於其自身。
矩陣 DirectX與OpenGL的不同
矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫directx和opengl對矩陣操作卻有著細微的差別,大多數的圖形學書籍都以opengl為基礎進行闡述,遊戲程式設計類的書籍則更多使用directx,...
矩陣 DirectX與OpenGL的不同
在三維圖形學中,一般使用四維矩陣,也就是四行四列的方陣,下面是乙個典型的四維矩陣 既然是三維圖形學,為什麼使用四維矩陣呢?主要有兩個原因,第一,為了平移變換,第二,為了區別點和向量 對於乙個四維向量,它是行向量還是列向量呢?directx使用行向量,如下。而opengl則使用列向量,如下 或者寫成 ...
矩陣 DirectX與OpenGL的不同
矩陣是三維圖形學中不可或缺的部分,幾乎所有和變換相關的操作都涉及矩陣,世界變換,檢視變換,投影變換,視口變換無一不需要矩陣,但是當今的兩大主流圖形庫directx和opengl對矩陣操作卻有著細微的差別,大多數的圖形學書籍都以opengl為基礎進行闡述,遊戲程式設計類的書籍則更多使用directx,...