【问题标题】:Column Major Order for OpenGLOpenGL 的列主要顺序
【发布时间】:2012-09-20 11:33:41
【问题描述】:

我正在编写用于 opengl 图形的数学类,它使用列主矩阵排序。这是家庭作业。

对于 mat3(我的矩阵 3x3 类)以及其他矩阵类,我想出了使用联合符号来描述矩阵数据。现在我担心我的排序是错误的(例如,行专业而不是列专业)。

#define real float
union
{
    real _data[9];
    struct
    { 
        real _11; real _12; real _13;
        real _21; real _22; real _23;
        real _31; real _32; real _33;
    };
    struct
    { 
        real _a; real _b; real _c;
        real _d; real _e; real _f;
        real _g; real _h; real _i;
    };

};

我是否应该按如下方式编写第二个结构:

struct
{ 
    real _a; real _d; real _g;
    real _b; real _e; real _h;
    real _c; real _f; real _i;
};

此外,我是否应该按如下方式编写第一个结构:

struct
{ 
    real _11; real _21; real _31;
    real _12; real _22; real _32;
    real _13; real _23; real _33;
};

这会影响矩阵乘法或其他数学运算(行列式、逆运算、转置...)的顺序吗?例如。目前,我的 mat3 乘法函数如下所示:

mat3 operator * ( const mat3 & l, const mat3 & r )
{
    // matrix matrix multiply
    return mat3(
        ( (l._11 * r._11) + (l._12 * r._21) + (l._13 * r._31) ), 
        ( (l._11 * r._12) + (l._12 * r._22) + (l._13 * r._32) ), 
        ( (l._11 * r._13) + (l._12 * r._23) + (l._13 * r._33) ),

        ( (l._21 * r._11) + (l._22 * r._21) + (l._23 * r._31) ),
        ( (l._21 * r._12) + (l._22 * r._22) + (l._23 * r._32) ),
        ( (l._21 * r._13) + (l._22 * r._23) + (l._23 * r._33) ),

        ( (l._31 * r._11) + (l._32 * r._21) + (l._33 * r._31) ),
        ( (l._31 * r._12) + (l._32 * r._22) + (l._33 * r._32) ),
        ( (l._31 * r._13) + (l._32 * r._23) + (l._33 * r._33) )
    );
}

据我了解,这个问题让很多人感到困惑。我认为在阅读了有关该主题的教科书之后会出现混淆,然后不得不坐在 IDE 前编写课程,这两个主题很少一起涵盖。

【问题讨论】:

    标签: c++ matrix-multiplication


    【解决方案1】:

    从数学上讲,矩阵乘法的工作方式相同,与列/行的主要顺序无关。列/行主要排序影响的是您创建这些矩阵的方式。例如,如何构建旋转矩阵。

    此外:

    我应该按如下方式编写第一个结构

    整个列/行的主要内容只对值的数组 重要。列/行的主要问题是关于如何将矩阵存储为数组。如果您有一个包含 9 个值的数组,并且 3x3 矩阵以行优先形式存储,那么第 2 列、第 1 行的索引将是从零开始的索引 1。在列优先存储中,第 2 列、第 1 行索引将是 3。

    所以看看你的工会。联合的重点是以不同的方式访问同一个浮点数。 _21 成员应该是第二列,第一行。如果是这种情况,那么您有责任确保它映射到数组的正确部分。如果数组应该是列优先的,那么_21 应该映射到与_data[3] 相同的值。如果是row major,它应该映射到_data[1]

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多