GLM-乘法运算

时间:2018-09-23 15:31:44

标签: matrix-multiplication glm-math

在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]访问矩阵的值,则此函数将返回正确的值,但是我已经测试过-矩阵的值由matrix[row][col]给出。以下代码返回结果{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 };

左矩阵中的列数必须与右矩阵中的行数匹配,因此我不明白为什么存在以下函数,但是此函数为我返回正确的结果({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有这么大的错误,所以我确定我会错过一些东西-我是否必须在标头前面定义一些东西,或者这种奇怪的行为是什么?

1 个答案:

答案 0 :(得分:1)

  

以下代码返回结果{23,34},但是正确的结果将是{17,39}:

不,不是。

glm::mat米是列大米。这意味着,按照您的定义,1.f, 2.f是矩阵的第一个。当您执行matrix * vector时,将得到矩阵的乘以向量的。矩阵的第一行是1.f, 3.f,当5.f, 6.f点积时为23。

您将得到什么。