2011-05-25 47 views
3

在Direct3D中乘以矩陣以獲得結果方面,我收到了兩個相沖突的答案。教程確實從左到右繁殖,這很好,但它不是我想象它的方式。Direct3D中的矩陣mult命令

下面是一個例子:

的OpenGL(從頂部讀到底部):

GLRotatef(90.0f); 
GLTranslatef(20.0f,0,0); 

所以你想象的世界軸旋轉30度。然後你在現在旋轉的X軸上翻譯20.0,看起來你正在向世界Y軸上升。

在Direct3D,這樣做的:

wm = rotatem * translatem; 

是不同的。它看起來像對象只是在原點旋轉,並在世界的X軸上翻譯,因此它向右而不是向上。它只有在我反轉訂單並從右向左閱讀時纔有效。

另外,例如,在frank luna的關於DX10的書中,他解釋瞭如何做鏡面反射。我得到了這一切,但是當他確實例如:

reflection_matrix = world_m * reflection_m; 

圍繞xy平面,我作爲第一個解釋此做一個全球定位則反射或相反?

回答

8

問題是您乘以矩陣的順序,以使得複合變換矩陣與它應該是相反的。你正在做的:wm = rotatem * translatem,它遵循你正在做的OpenGL操作的順序,但對DirectX矩陣應該已經wm = translatem * rotatem

OpenGL和DirectX之間根本的區別在於,OpenGL的治療矩陣中列主要事實訂單,而DirectX在行處理主要訂單。

要從列主要行到主要行,您需要找到OpenGL矩陣的轉置(交換行和列)。

所以,如果你在OpenGL編寫wm = rotatem * translatem,那麼你想要的,對DirectX的轉置,那就是:

wmT = (rotatem*translatem)T = translatemT * rotatemT 

這就解釋了爲什麼在矩陣的乘法順序在DirectX的逆轉。

+0

換句話說,我爲所有目的都做對了。那麼,我是否假設作者意在首先反思,然後應用世界矩陣? – Ilya 2011-05-25 03:23:17

+0

我需要更多的背景來弄清楚作者的意圖。但是你提到的opengl和directx之間的轉換順序的差異是非常有意義的。 – 2011-05-25 03:26:11

+0

作者的意圖是展示如何鏡像物體,這些物體只是立方體在任意xy平面上的反射。這是有道理的,反射將在世界轉換後執行,但這將需要矩陣順序應該是:reflection_matrix * world_matrix如果我從右向左讀。 – Ilya 2011-05-25 03:30:51

1

請參閱this answer。在OpenGL中,每個後續操作都是前面所有操作的前乘法,而不是後乘法。您可以看到矢量的矩陣乘法作爲函數評估。

如果你想要的是第一個旋轉矢量,然後翻譯你的旋轉矢量,您在OpenGL會先調用glRotatef,然後調用glTranslatef已經解決了,你可以表達,使用函數調用作爲

myNewVector = translate(rotate(myOldVector)) 

rotate功能做到這一點

rotate(anyVector) = rotationMatrix * anyVector 

translate功能做到這一點

translate(anyOtherVector) = translationMatrix * anyOtherVector 

所以採用矩陣乘法相當於你的表情看起來像

myNewVector = translationMatrix * rotationMatrix * myOldVector 

也就是說,你的組合變換矩陣看起來是translationMatrix * rotationMatrix