【问题标题】:Eigen and glm products produce different resultsEigen 和 glm 产品产生不同的结果
【发布时间】:2020-08-15 17:53:25
【问题描述】:

我试图在我正在编写的应用程序中将 glm 替换为 eigen,但我遇到了一个深奥的问题。

这将是相关代码:

glm::mat4 EigenToGlmMat(const Eigen::Matrix4f& v)
{
    glm::mat4 ret;
    ret[0][0] = v(0,0);
    ret[0][1] = v(0,1);
    ret[0][2] = v(0,2);
    ret[0][3] = v(0,3);

    ret[1][0] = v(1,0);
    ret[1][1] = v(1,1);
    ret[1][2] = v(1,2);
    ret[1][3] = v(1,3);

    ret[2][0] = v(2,0);
    ret[2][1] = v(2,1);
    ret[2][2] = v(2,2);
    ret[2][3] = v(2,3);

    ret[3][0] = v(3,0);
    ret[3][1] = v(3,1);
    ret[3][2] = v(3,2);
    ret[3][3] = v(3,3);

    return ret;
}


    Eigen::Matrix4f mp = camera->GetProjectionMatrix();
    Eigen::Matrix4f mv = camera->GetViewMatrix();

    mat4 vp_mat = EigenToGlmMat(mp) * EigenToGlmMat(mv);
    mat4 tmp =  EigenToGlmMat(mp * mv);
    cout << glm::to_string(vp_mat) << endl << endl;
    cout << glm::to_string(tmp) << endl << endl;

现在考虑以下几行:

    auto mp = camera->GetProjectionMatrix();
    auto mv = camera->GetViewMatrix();

    mat4 vp_mat = EigenToGlmMat(mp) * EigenToGlmMat(mv);
    mat4 tmp =  EigenToGlmMat(mp * mv);

这两个结果应该是等价的,毕竟它们只是计算矩阵的乘积并且矩阵输入是相同的。然而这是输出:

mat4x4(
(2.414213, 0.000000, 0.000000, 0.000000), 
(0.000000, -2.414213, 0.000000, 0.000000), 
(0.000000, 0.000000, 1.002002, 1.000000), 
(0.000000, 0.000000, 4.308809, 4.500000))

mat4x4(
(2.414213, 0.000000, -0.000000, 0.000000), 
(0.000000, -2.414213, -0.000000, 0.000000), 
(0.000000, 0.000000, 5.502002, -1.000000), 
(0.000000, 0.000000, 0.200200, 0.000000))

唯一的功能区别是使用 glm 和其他特征计算产品。我怎么可能得到不同的结果?这是 Eigen 中的错误吗?

顺便说一句,这不是转置问题,这是EigenToGlmMat转换前后的2个矩阵的输出

2.41421       0       0       0
      0 2.41421       0       0
      0       0  -1.002      -1
      0       0 -0.2002       0


  1  0 -0  0
  0 -1 -0  0
 -0  0 -1  0
 -0 -0 -6  1

mat4x4(
(2.414213, 0.000000, 0.000000, 0.000000), 
(0.000000, 2.414213, 0.000000, 0.000000), 
(0.000000, 0.000000, -1.002002, -1.000000), 
(0.000000, 0.000000, -0.200200, 0.000000))

mat4x4(
(1.000000, 0.000000, -0.000000, 0.000000), 
(0.000000, -1.000000, -0.000000, 0.000000), 
(-0.000000, 0.000000, -1.000000, 0.000000), 
(-0.000000, -0.000000, -6.000000, 1.000000))

【问题讨论】:

    标签: c++ math matrix eigen glm-math


    【解决方案1】:

    您在不知不觉中转置矩阵。当使用(i, j) 访问Eigen::Matrix4f 时,您访问的是行i 和列jglm::mat4 的下标运算符返回一列,因此使用 [i][j] 您访问的是列 i 和行 j

    解决办法如下:

    glm::mat4 EigenToGlmMat(const Eigen::Matrix4f& v)
    {
        glm::mat4 result;
        for (size_t i = 0; i < 4; ++i) {
            for (size_t j = 0; j < 4; ++j) {
                result[i][j] = v(j, i);
            }
        }
    
        return result;
    }
    

    【讨论】:

    • 打印时矩阵看起来相同,我使用此信息编辑了问题。
    • @Makogan 你是如何打印输入矩阵的?也许您在打印时不知不觉地调换了它们,因此您不会注意到差异。你为什么不直接用这个方法,看看乘法结果是否一样。我相信它会的。
    • 使用默认打印机,所以对于 eigen:cout &lt;&lt; mat &lt;&lt; endl 和对于 glm cout &lt;&lt; to_string(mat) &lt;&lt; endl
    • 嗯,不,看来你是对的,其他地方发生了一些更奇怪的事情
    • @Makogan glm 正在以列优先顺序打印矩阵(请参阅github.com/g-truc/glm/blob/master/glm/gtx/string_cast.inl#L419),这就是您没有注意到转置的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 2018-05-23
    • 2017-09-11
    • 2020-03-14
    • 2015-03-11
    • 2016-06-04
    相关资源
    最近更新 更多