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.
这就是你得到的。
在 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.
这就是你得到的。