2012-09-28 82 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]