Eigen 和 glm 产品产生不同的结果
Eigen and glm products produce different results
我试图在我正在编写的应用程序中用 eigen 替换 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),
(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))
你在不知不觉中转置了矩阵。使用 (i, j)
访问 Eigen::Matrix4f
时,您正在访问行 i
和列 j
。 glm::mat4
的下标运算符 returns 你是一列,所以使用 [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;
}
我试图在我正在编写的应用程序中用 eigen 替换 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),
(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.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))
你在不知不觉中转置了矩阵。使用 (i, j)
访问 Eigen::Matrix4f
时,您正在访问行 i
和列 j
。 glm::mat4
的下标运算符 returns 你是一列,所以使用 [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;
}