0

我一直盯着这些东西看很久了,我的脑袋都在发呆,但我想我明白了。我正在使用矩阵库,矩阵的数据存储为:

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. 但是这些数据可能在列优先或行优先系统中的这个位置,所以它可能是一个微不足道的证据。

4

1 回答 1

0

列与行主要实际上是一个解释问题,因为如果这些是列主要矩阵,则矩阵乘法代码看起来完全相同。即,vec4 成员可以简单地解释为列。

也就是说,我认为列主矩阵是邪恶的和错误的,因为这就是我学习线性代数的方式:) 向量是 4x1 矩阵(一列),向量变换是:4x4 x 4x1 = 4x1。外部术语给出尺寸,内部术语使其合法。1x4 x 4x4 = 1x4 是合法的,但在有序的宇宙中没有位置。像左手坐标空间。

我一直很喜欢来自不同 SGI 校友的这些帖子。

于 2013-06-10T15:40:53.060 回答