在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平面周围,我是否将其解释为首先进行世界定位然后反射或相反?
问题是你将矩阵乘以使复合变换矩阵与它应该相反的顺序.您正在执行: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中必须颠倒矩阵乘法的阶数.
| 归档时间: |
|
| 查看次数: |
5078 次 |
| 最近记录: |