Поведение умножения векторной матрицы с GLM? - PullRequest
1 голос
/ 30 октября 2019

Я ни в коем случае не математик, и я пытаюсь понять, что происходит с умножением GLM между векторами и матрицами. Из того, что я понимаю, матрицы GLM имеют размер столбцов х строк, и при обычном умножении матриц в GLM левая часть выражения должна иметь такое же количество столбцов, что и правая часть имеет строки. Итак, вот мой вопрос.

Меня смущает то, что я могу умножить матрицу 2х3 на трехмерный вектор

| 1, 4 |
| 2, 5 | x [ 1, 2, 3 ]
| 3, 6 |

, дав мне ответ [ 9, 12, 15 ]. Но я также могу умножить матрицу 3x2 на тот же трехмерный вектор

| 1, 3, 5 |
| 2, 4, 6 | x [ 1, 2, 3 ]

, и теперь я получаю двумерный вектор [ 22, 28 ]. Почему это возможно? Что здесь происходит?

Что меня еще смущает, так это то, что я могу поменять порядок и поместить вектор слева, а матрицу справа, и я все еще получаю действительный результат. Опять же, почему это возможно? Что случилось? И является ли это специфичным для GLM поведением, или это стандартное поведение матрицы?

Прошу прощения, если это простая математика, однако после многих часов поиска в Интернете и тестирования самостоятельно с помощью GLM я все еще не понимаюконцепция. Я ценю любую помощь. Спасибо.

РЕДАКТИРОВАТЬ: Вот пример кода

#define GLM_ENABLE_EXPERIMENTAL

#include <iostream>
#include <glm/mat2x3.hpp>
#include <glm/mat3x2.hpp>
#include <glm/gtx/string_cast.hpp>

int main() {
    glm::mat2x3 a = {
        1, 2, 3, 
        4, 5, 6
    };

    glm::mat3x2 b = {
        1, 2,
        3, 4,
        5, 6
    };

    glm::vec3 c = {
       1, 2, 3
    };

    // These all compile correctly? And each gives different results.
    std::cout << glm::to_string(a * c) << std::endl;
    std::cout << glm::to_string(c * a) << std::endl;
    std::cout << glm::to_string(b * c) << std::endl;
    std::cout << glm::to_string(c * b) << std::endl;
}

Вывод консоли следующий

vec3(9.000000, 12.000000, 15.000000)
vec2(14.000000, 32.000000)
vec2(22.000000, 28.000000)
vec3(5.000000, 11.000000, 17.000000)

1 Ответ

0 голосов
/ 01 ноября 2019

Я нашел, что происходит! Проблема в конечном итоге не имела ничего общего с матрицами, а скорее была причуда GLM. В примере кода a * c и c * b могут компилироваться, поскольку c неявно приводится к двумерному вектору без какого-либо предупреждения. Все просто, но очень запутанно!

...