代码之家  ›  专栏  ›  技术社区  ›  Mark Ingram

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

  •  2
  • Mark Ingram  · 技术社区  · 14 年前

    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使用这些旋转矩阵的转置。

    在我的应用程序中,我有一个通用矩阵类,它使用标准的数学旋转表示。用一个简单的旋转大约1个轴,它很容易转换成Direct3D矩阵,因为你可以只做换位。然而,如果你旋转x,y,然后z,你不能简单地得到转置矩阵。

    下面是一个例子:

    矩阵矩阵;
    基质旋转体(1.0f);

    RotateZ矩阵(1.0f);


    m_0.29192656浮子
    m_12-0.45464867浮子
    m_13 0.84147096浮子

    m U 21 0.83722234浮子
    m_22-0.30389664浮子
    m_23-0.45464867浮子

    m_31 0.46242565浮子
    m U 32 0.83722234浮子
    m_33 0.29192656浮子

    m_41 0.00000000浮动
    m_42 0.00000000浮动
    m_43 0.00000000浮动

    Direct3D矩阵=
    _11 0.29192656浮子

    _13-0.84147096浮子
    _14 0.00000000浮动
    _21-0.07207509浮子
    _22 0.88774973浮子
    _23 0.45464867浮子
    _24 0.00000000浮动

    _32-0.07207509浮子

    _34 0.00000000浮动

    _42 0.00000000浮动
    _43 0.00000000浮动

    编辑 :下面是一些单独旋转的示例。


    我的矩阵类:

    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
    

    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矩阵正是matrix类的转置(我的类给出的结果与Wikipedia在本问题顶部给出的示例相同)。

    3 回复  |  直到 14 年前
        1
  •  4
  •   timday    14 年前

    我一直把这种困惑追溯到80年代末。据我记忆,当时有两本关于图形的特别有影响力的书。其中一个在矩阵的左边写向量作为行向量;这本书非常面向硬件-概念上你认为向量是通过转换矩阵的管道从左到右流动的。Rendermorphics(后来被微软收购成为Direct3D)走上了这条路。另一本书把向量写成了矩阵右边的列向量,这就是OpenGL的工作方式(我认为大多数数学家自然会倾向于此,尽管我遇到过例外情况)。

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

    你不是第一个被迷惑的人 this also ).

        2
  •  1
  •   CiscoIPPhone    14 年前

    只有当你对其进行旋转等操作时,惯用手才会显现出来。 只要在DIrectX矩阵和“数学矩阵”上执行相同的操作,转置就应该给出您要查找的结果。我的猜测是旋转的实现方式不同,或者旋转的顺序不同。

        3
  •  1
  •   Pete Kirkham    14 年前

    假设主对角线上的唯一项是 ?sin(θ) sin(-θ)=-sin(θ) 但是 cos(-θ)=cos(θ)