2012-09-28 50 views
1

我正在编写用于使用opengl图形的数学类,它使用列主矩阵排序。这是作业。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 _11; real _21; real _31; 
    real _12; real _22; real _32; 
    real _13; real _23; real _33; 
}; 

这会不会影响的顺序为:

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

进一步,我应该如下写第一个结构矩阵乘法或其他数学运算(行列式,反转,转置...)?例如。目前,我的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的前面写下课程,这两个主题很少会被共同使用。

回答

2

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

此外:

我应该写第一个结构如下

全行/列重大的事情只能事项阵列值。列/行主要问题是关于如何将矩阵存储为数组。如果有9个值的数组,并且3x3矩阵以行主要形式存储,则第2列第1行的索引将为从零开始的索引1.在列主存储中,第2列第一行索引将是3.

所以看看你的工会。工会的要点是以不同的方式访问相同的浮动。 _21成员应该是第二列,第一行。如果是这种情况,那么确保它映射到阵列的右侧部分是您的责任。如果阵列应该是列主要的,那么_21应映射到与_data[3]相同的值。如果它是主要行,它应该映射到_data[1]