当表示数学矩阵时,旋转按如下方式执行:
http://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
Rx(θ) = 1 0 0
0 cos θ -sin θ
0 sin θ cos θ
Ry(θ) = cos θ 0 sin θ
0 1 0
-sin θ 0 cos θ
Rz(θ) = cos θ -sin θ 0
sin θ cos θ 0
0 0 1
但是,我发现Direct3D使用这些旋转矩阵的转置。
在我的应用程序中,我有一个泛型Matrix类,它使用标准的数学旋转表示法。通过简单的1轴旋转,很容易转换为Direct3D矩阵,因为您可以进行转置。但是,如果围绕x,y然后旋转z,则不能简单地获得转置矩阵。
我的问题是,如何将数学矩阵转换为Direct3D矩阵?
以下是一个例子:
矩阵矩阵;
matrix.RotateX(1.0F);
matrix.RotateY(1.0F);
matrix.RotateZ(1.0F);数学矩阵=
m_11 0.29192656浮子
m_12 -0.45464867浮动
m_13 0.84147096浮动
m_14 0.00000000浮动
m_21 0.83722234 float
m_22 -0.30389664 float
m_23 -0.45464867浮动
m_24 0.00000000浮子
m_31 0.46242565浮动
m_32 0.83722234 float
m_33 0.29192656浮动
m_34 0.00000000浮子
m_41 0.00000000浮子
m_42 0.00000000浮子
m_43 0.00000000浮子
m_44 1.0000000浮动Direct3D矩阵=
_11 0.29192656浮动
_12 0.45464867浮动
_13 -0.84147096浮动
_14 0.00000000浮动
_21 -0.072075009浮动
_22 0.88774973浮动
_23 0.45464867浮动
_24 0.00000000浮动
_31 0.95372111浮动
_32 -0.072075009浮动
_33 0.29192656浮动
_34 0.00000000浮动
_41 0.00000000浮动
_42 0.00000000浮动
_43 0.00000000浮动
_44 1.0000000浮动
编辑:以下是个别轮换的一些示例。
X轴旋转1弧度
我的矩阵类:
1.0000000 0.00000000 0.00000000 0.00000000
0.00000000 0.54030228 -0.84147096 0.00000000
0.00000000 0.84147096 0.54030228 0.00000000
0.00000000 0.00000000 0.00000000 1.0000000
Direct3D:
1.0000000 0.00000000 0.00000000 0.00000000
0.00000000 0.54030228 0.84147096 0.00000000
0.00000000 -0.84147096 0.54030228 0.00000000
0.00000000 0.00000000 0.00000000 1.0000000
正如你所看到的,Direct3D矩阵正好是我的矩阵类的转置(我的类给出了与维基百科在这个问题顶部给出的例子相同的结果)。
答案 0 :(得分:4)
我总是把这种困惑追溯到80年代后期。我记得当时有两本关于图形的特别有影响力的书籍。其中一个人在矩阵的左边写了向量作为行向量;这本书非常注重硬件 - 从概念上讲,你认为矢量是通过变换矩阵管道从左到右流动的。 Rendermorphics(后来被微软选中成为Direct3D)沿着这条路走下去。另一本书在矩阵右侧将向量写为列向量,这是OpenGL的做法(我认为大多数数学家自然会倾向于这一点,尽管我遇到了异常)。
然而,这两种方法完全同样有效的数学!如果你对Direct3D感到困惑,那就开始考虑在矩阵左边写行向量,而不是在转置矩阵方面。
答案 1 :(得分:1)
DirectX矩阵类是数学矩阵的实现。
只有当您对它进行操作(如旋转)时,手性才会显现出来。 只要在DIrectX矩阵和“数学矩阵”上完成相同的操作,转置就会给你想要的结果。我的猜测是旋转的实现有所不同,或者旋转的顺序不同。
答案 2 :(得分:1)
鉴于素数对角线的唯一项是±sin(θ)形式,而 sin(-θ)= - sin(θ) cos(-θ)= cos(θ),Direct3D与维基百科数学之间的关系也可以看作是角度方向的相反解释。