Я ни в коем случае не математик, и я пытаюсь понять, что происходит с умножением 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)