我一直盯着这些东西看很久了,我的脑袋都在发呆,但我想我明白了。我正在使用矩阵库,矩阵的数据存储为:
struct Matrix4{
vec4 x;
vec4 y;
vec4 z;
vec4 w;
..... functions
}
Avec4
只是一个结构,其数据为:
T x;
T y;
T z;
T w;
(T
通常是一个float
)
关键问题大概可以这样回答:
Matrix4 operator * (const Matrix4& b) const
{
Matrix4 m;
m.x.x = x.x * b.x.x + x.y * b.y.x + x.z * b.z.x + x.w * b.w.x;
m.x.y = x.x * b.x.y + x.y * b.y.y + x.z * b.z.y + x.w * b.w.y;
m.x.z = x.x * b.x.z + x.y * b.y.z + x.z * b.z.z + x.w * b.w.z;
m.x.w = x.x * b.x.w + x.y * b.y.w + x.z * b.z.w + x.w * b.w.w;
m.y.x = y.x * b.x.x + y.y * b.y.x + y.z * b.z.x + y.w * b.w.x;
m.y.y = y.x * b.x.y + y.y * b.y.y + y.z * b.z.y + y.w * b.w.y;
m.y.z = y.x * b.x.z + y.y * b.y.z + y.z * b.z.z + y.w * b.w.z;
m.y.w = y.x * b.x.w + y.y * b.y.w + y.z * b.z.w + y.w * b.w.w;
m.z.x = z.x * b.x.x + z.y * b.y.x + z.z * b.z.x + z.w * b.w.x;
m.z.y = z.x * b.x.y + z.y * b.y.y + z.z * b.z.y + z.w * b.w.y;
m.z.z = z.x * b.x.z + z.y * b.y.z + z.z * b.z.z + z.w * b.w.z;
m.z.w = z.x * b.x.w + z.y * b.y.w + z.z * b.z.w + z.w * b.w.w;
m.w.x = w.x * b.x.x + w.y * b.y.x + w.z * b.z.x + w.w * b.w.x;
m.w.y = w.x * b.x.y + w.y * b.y.y + w.z * b.z.y + w.w * b.w.y;
m.w.z = w.x * b.x.z + w.y * b.y.z + w.z * b.z.z + w.w * b.w.z;
m.w.w = w.x * b.x.w + w.y * b.y.w + w.z * b.z.w + w.w * b.w.w;
return m;
}
在列优先系统中,operator*
应该假设左侧矩阵的顶行不在连续内存中,因为它存储每个列向量的第一个元素。该函数显然将左侧矩阵(*this
矩阵)的第一行视为连续的,因此暗示这是一个行优先矩阵库,对吧?
在看了这么久之后,我认为真正确定一个库是列优先还是行优先的唯一方法是查看它如何处理乘法以及它如何布置数据。
虽然可能没有必要诊断我的问题,但库为 3d 翻译转换提供的翻译矩阵将x, y, z
数据放在最终的vec4
. 但是这些数据可能在列优先或行优先系统中的这个位置,所以它可能是一个微不足道的证据。