具有GLM的矢量矩阵乘法行为?

问题描述 投票:1回答:1

我绝不是数学家,我试图了解GLM向量和矩阵之间的乘法运算所发生的情况。据我了解,GLM的矩阵大小为列x行,在GLM中的普通矩阵乘法中,表达式的左侧必须与右侧的行具有相同的列数。所以这是我的问题所在。

令我困惑的是我可以将2x3矩阵乘以三维矢量

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

给我一个[ 9, 12, 15 ]的答案。但是我也可以将3x2矩阵乘以相同的3D向量

| 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)
c++ math matrix glm-math
1个回答
0
投票

我发现发生了什么事!问题最终与矩阵完全无关,而只是GLM的怪癖。在代码示例中,a * cc * b可以编译,因为c被隐式转换为二维矢量而没有任何警告。如此简单,但非常令人困惑!

© www.soinside.com 2019 - 2024. All rights reserved.