本征和glm产品产生不同的结果

问题描述

我正在尝试在正在编写的应用程序中用特征码替换glm,但是我遇到了一个深奥的问题。

这将是相关代码:

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,-2.414213,1.002002,1.000000),4.308809,4.500000))

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

唯一的功能差异是使用glm和其他特征来计算乘积。我怎么可能得到不同的结果?这是Eigen的错误吗?

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

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,2.414213,-1.002002,-0.200200,0.000000))

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

解决方法

您在不知不觉中转置矩阵。使用Eigen::Matrix4f访问(i,j)时,您正在访问行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;
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...