GLM - операция умножения - PullRequest
       10

GLM - операция умножения

0 голосов
/ 23 сентября 2018

В 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 голосов
/ 23 сентября 2018

Следующий код возвращает результат {23, 34}, но правильный результат будет {17, 39}:

Нет, это не так.

glm::mat цены являются основными столбцами.Это означает, что, по вашему определению, 1.f, 2.f - это первый столбец вашей матрицы.Когда вы делаете matrix * vector, вы получаете строк матрицы, умноженной на столбцов вектора.Первая строка вашей матрицы - 1.f, 3.f, которая при точечной обработке 5.f, 6.f равна 23.

Что вы и получаете.

...