我正在比较使用矩阵的三维图形的两个不同的线性数学库。以下是这两个库中的两个类似的翻译功能:这些函数是列专业还是行专业?
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