Direct3D中的矩阵多阶

Ily*_*lya 4 directx 3d

在Direct3D中乘以矩阵以获得结果时,我收到了两个相互矛盾的答案.教程确实表示要从左到右相乘,这很好,但这不是我想象它的方式.

这是一个例子:

OpenGL(从上到下阅读):

GLRotatef(90.0f);
GLTranslatef(20.0f,0,0);
Run Code Online (Sandbox Code Playgroud)

因此,您可以将世界轴旋转30度.然后在现在旋转的x轴上平移20.0,这样看起来你正在世界y轴上升.

在Direct3D中,做:

wm = rotatem * translatem;
Run Code Online (Sandbox Code Playgroud)

是不同的.看起来这个物体只是在原点处旋转并在世界的x轴上平移,因此它向右移动而不是向上移动.它只有在我颠倒顺序并从右到左阅读时才有效.

还有例如,在frank luna的关于DX10的书中,他开始解释如何进行镜像反射.我得到了所有这一切,但是当他这样做时:

reflection_matrix = world_m * reflection_m;
Run Code Online (Sandbox Code Playgroud)

在xy平面周围,我是否将其解释为首先进行世界定位然后反射或相反?

Him*_*ury 9

问题是你将矩阵乘以使复合变换矩阵与它应该相反的顺序.您正在执行:wm = rotatem * translatem,它遵循您为OpenGL执行的操作顺序,但对于DirectX,矩阵应该是wm = translatem * rotatem

OpenGL和DirectX之间的根本区别在于OpenGL以列主要顺序处理矩阵,而DirectX以行主要顺序处理matric .

要从专业列转到行专业,您需要找到OpenGL矩阵的转置(交换行和列).

所以,如果你用wm = rotatem * translatemOpenGL编写,那么你想要为DirectX进行转置,即:

wmT = (rotatem*translatem)T = translatemT * rotatemT
Run Code Online (Sandbox Code Playgroud)

这解释了为什么在DirectX中必须颠倒矩阵乘法的阶数.