1

列優先の行列順序を使用する 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 つの主題が一緒に扱われることはめったにないため、混乱が生じると思います。

4

1 に答える 1

2

行列の乗算は、数学的に言えば、列/行の主要な順序に関係なく同じように機能します。列/行の主要な順序が影響するのは、これらの行列を作成する方法です。たとえば、回転行列を作成する方法。

さらに:

次のように最初の構造体を書くべきですか

列/行全体の主なものは、値の配列に対してのみ重要です。列/行の主な問題は、行列を配列として格納する方法についてです。9 つの値の配列があり、3x3 行列が行優先形式で格納されている場合、2 列目の 1 行目のインデックスはゼロ ベースのインデックス 1 になります。列優先の格納では、2 列目の最初の行インデックス3になります。

だからあなたの組合を見てください。ユニオンのポイントは、同じフロートに異なる方法でアクセスすることです。メンバーは 2 列目、1 行目の_21はずです。その場合、それが配列の正しい部分にマップされていることを確認するのはあなたの責任です。配列が列優先であると想定されている場合は_21、 と同じ値にマップする必要があります_data[3]。行優先の場合は、にマップする必要があります_data[1]

于 2012-09-28T16:07:26.243 に答える