列優先の行列順序を使用する 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;
};
};
代わりに、その 2 番目の構造体を次のように記述する必要があります。
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 の前に座ってクラスを作成しなければならず、2 つの主題が一緒に扱われることはめったにないため、混乱が生じると思います。