关于在 Direct3D 中乘法矩阵以获得结果,我收到了两个相互矛盾的答案。教程确实规定从左到右相乘,这很好,但这不是我想象的方式。
这是一个例子:
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 平面,我是否将其解释为首先进行世界定位,然后进行反射,还是相反?
问题是矩阵相乘以获得复合变换矩阵的顺序与应有的顺序相反。你正在做:wm = rotatem * translatem
,它遵循您为 OpenGL 执行的操作顺序,但对于 DirectX,矩阵应该是wm = translatem * rotatem
OpenGL 和 DirectX 之间的根本区别在于 OpenGL 以以下方式处理矩阵:专栏专业顺序,而 DirectX 处理矩阵行专业 order.
要从列专业转到行专业,您需要找到 OpenGL 矩阵的转置(交换行和列)。
所以,如果你写wm = rotatem * translatem
在 OpenGL 中,那么您需要将其转置为 DirectX,即:
wmT = (rotatem*translatem)T = translatemT * rotatemT
这解释了为什么 DirectX 中矩阵乘法的顺序必须颠倒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)