如何将数学矩阵转换为Direct3D矩阵?

时间:2010-11-07 16:10:10

标签: c++ math matrix rotation direct3d

当表示数学矩阵时,旋转按如下方式执行:

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矩阵正好是我的矩阵类的转置(我的类给出了与维基百科在这个问题顶部给出的例子相同的结果)。

3 个答案:

答案 0 :(得分:4)

我总是把这种困惑追溯到80年代后期。我记得当时有两本关于图形的特别有影响力的书籍。其中一个人在矩阵的左边写了向量作为行向量;这本书非常注重硬件 - 从概念上讲,你认为矢量是通过变换矩阵管道从左到右流动的。 Rendermorphics(后来被微软选中成为Direct3D)沿着这条路走下去。另一本书在矩阵右侧将向量写为列向量,这是OpenGL的做法(我认为大多数数学家自然会倾向于这一点,尽管我遇到了异常)。

然而,这两种方法完全同样有效的数学!如果你对Direct3D感到困惑,那就开始考虑在矩阵左边写行向量,而不是在转置矩阵方面。

你不是第一个被this迷惑的人(见also)。

答案 1 :(得分:1)

DirectX矩阵类是数学矩阵的实现。

只有当您对它进行操作(如旋转)时,手性才会显现出来。 只要在DIrectX矩阵和“数学矩阵”上完成相同的操作,转置就会给你想要的结果。我的猜测是旋转的实现有所不同,或者旋转的顺序不同。

答案 2 :(得分:1)

鉴于素数对角线的唯一项是±sin(θ)形式,而 sin(-θ)= - sin(θ) cos(-θ)= cos(θ),Direct3D与维基百科数学之间的关系也可以看作是角度方向的相反解释。