我正在使用矩阵比较两个不同的 3D 图形线性数学库。以下是两个库中的两个类似的翻译函数:
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;
}
(来自 SO 用户的 c++ 库)
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
按该顺序执行 a )。
我在左关联上下文中多次使用了第一个示例,并且它一直按预期工作。虽然我没有使用过第二种,但作者说它是右关联的,但我无法看到两者格式之间的差异。