在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有这么大的错误,所以我确定我会错过一些东西-我是否必须在标头前面定义一些东西,或者这种奇怪的行为是什么?
答案 0 :(得分:1)
以下代码返回结果{23,34},但是正确的结果将是{17,39}:
不,不是。
glm::mat
米是列大米。这意味着,按照您的定义,1.f, 2.f
是矩阵的第一个列。当您执行matrix * vector
时,将得到矩阵的行乘以向量的列。矩阵的第一行是1.f, 3.f
,当5.f, 6.f
点积时为23。
您将得到什么。