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 _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前写课程,这两个主题很少被掩盖在一起。

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

此外:

我应该按照以下编写第一个结构吗

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

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

最新更新