В 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 такая большая ошибка, поэтому я уверен, что что-то упущу - нужно ли что-то определять перед заголовком или каким может быть это странное поведение?