我正在比較使用矩陣的三維圖形的兩個不同的線性數學庫。以下是這兩個庫中的兩個類似的翻譯功能:這些函數是列專業還是行專業?
static Matrix4<T> Translate(T x, T y, T z)
{
Matrix4 m;
m.x.x = 1; m.x.y = 0; m.x.z = 0; m.x.w = 0;
m.y.x = 0; m.y.y = 1; m.y.z = 0; m.y.w = 0;
m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
m.w.x = x; m.w.y = y; m.w.z = z; m.w.w = 1;
return m;
}
(C++從SO用戶prideout庫)
static inline void mat4x4_translate(mat4x4 T, float x, float y, float z)
{
mat4x4_identity(T);
T[3][0] = x;
T[3][1] = y;
T[3][2] = z;
}
(從SO用戶datenwolf linmath C庫)
我是新到這個東西,但我知道矩陣乘法的順序很大程度上取決於您是否使用列主要或行主要格式。
在我眼中,這兩個使用相同的格式,在第一個索引被視爲行,第二個索引是列。也就是說,在x y z
都適用於相同的第一個索引。這對我來說意味着行 - 主,因此矩陣乘法是左聯合的(例如,您通常按照該順序執行rotate * translate
)。
我已經在左聯合上下文中多次使用第一個示例,並且它一直按預期工作。雖然我沒有使用第二種,但作者說這是正確的聯想,但我很難看到兩者的格式之間的差異。
除了迄今爲止的出色答案之外,我發現這篇有用的文章解釋了這種情況:http://fgiesen.wordpress.com/2012/02/12/row-major-vs-column-major- row-vectors-vs-column-vectors/ – johnbakers 2013-03-24 01:54:43