GLM - 乘法运算

GLM - multiplication operation

在 GLM 中,当矩阵乘以向量时会调用以下运算符:

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::col_type operator*
(
    mat<2, 2, T, Q> const& m,
    typename mat<2, 2, T, Q>::row_type const& v
)
{
    return vec<2, T, Q>(
        m[0][0] * v.x + m[1][0] * v.y,
        m[0][1] * v.x + m[1][1] * v.y);
}

如果可以使用 matrix[col][row] 访问矩阵的值,此函数将 return 正确的值,但我已经测试过 - 矩阵的值由 [=14] 给出=].以下代码 return 的结果是 {23, 34},但正确的结果是 {17, 39}:

glm::mat2 mat2    {
    1.f, 2.f,
    3.f, 4.f
};
glm::vec2 vec2    { 5.f, 6.f };
glm::vec2 result  { mat2 * vec2 };

左矩阵的列数必须与右矩阵的行数匹配,所以我不明白为什么存在以下函数,但是这个函数 returns 正确的结果 ({17 , 39}) 对我来说:

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER typename mat<2, 2, T, Q>::row_type operator*
(
    typename mat<2, 2, T, Q>::col_type const& v,
    mat<2, 2, T, Q> const& m
)
{
    return vec<2, T, Q>(
        v.x * m[0][0] + v.y * m[0][1],
        v.x * m[1][0] + v.y * m[1][1]);
}

并由 vec2 * mat2 调用。

我无法想象 GLM 有这么大的错误,所以我确定我会错过一些东西 - 我是否必须在 header 前面定义一些东西或者这种奇怪的行为是什么?

The following code returns the result {23, 34}, but the correct result would be {17, 39}:

不,不是。

glm::mat米饭是列专业的。这意味着,在您的定义中,1.f, 2.f 是矩阵的第一个 。当您执行 matrix * vector 时,您会得到矩阵的 乘以向量的 。矩阵的第一行是 1.f, 3.f,当由 5.f, 6.f 点积时,它是 23.

这就是你得到的。