gpt4 book ai didi

c++ - glm::mat4 * glm::mat4 产生不正确的结果?

转载 作者:行者123 更新时间:2023-11-28 02:03:33 30 4
gpt4 key购买 nike

对于上下文,我一直在学习 OpenGL,并且学习了透视投影。花了整整一个小时试图弄清楚为什么我的三角金字塔没有正确显示,直到我注意到我的一个矩阵乘法(使用 operator* for glm::mat4 执行)给出了不正确的结果。尝试在该上下文之外将两个具有相同值的矩阵相乘,果然,结果仍然不正确。

我尝试相乘的两个矩阵是:

glm::mat4 left, right;
left[0][0] = 2.09928f; left[0][1] = 0.0f; left[0][2] = 0.0f; left[0][3] = 0.0f;
left[1][0] = 0.0f; left[1][1] = 3.73205f; left[1][2] = 0.0f; left[1][3] = 0.0f;
left[2][0] = 0.0f; left[2][1] = 0.0f; left[2][2] = 1.0202f; left[2][3] = -2.0202f;
left[3][0] = 0.0f; left[3][1] = 0.0f; left[3][2] = 1.0f; left[3][3] = 0.0f;

right[0][0] = 0.999998f; right[0][1] = 0.0f; right[0][2] = -0.00174533f; right[0][3] = 0.0f;
right[1][0] = 0.0f; right[1][1] = 1.0f; right[1][2] = 0.0f; right[1][3] = 0.0f;
right[2][0] = 0.00174533f; right[2][1] = 0.0f; right[2][2] = 0.999998f; right[2][3] = 5.0f;
right[3][0] = 0.0f; right[3][1] = 0.0f; right[3][2] = 0.0f; right[3][3] = 1.0f;

使用 left * right,我得到:

       2.09928,       0, -0.00178059, 0.00352592 
0, 3.73205, 0, 0
0.00366393, 0, 6.0202, -2.0202
0, 0, 1, 0

这是不正确的。另一方面,使用这种乘法算法:

inline glm::mat4 Multiply(const glm::mat4& left, const glm::mat4 right)
{
glm::mat4 ret;

for (unsigned int i = 0; i < 4; i++) {
for (unsigned int j = 0; j < 4; j++) {
ret[i][j] = left[i][0] * right[0][j] +
left[i][1] * right[1][j] +
left[i][2] * right[2][j] +
left[i][3] * right[3][j];
}
}

return ret;
}

我得到:

       2.09928,       0, -0.00366393,      0 
0, 3.73205, 0, 0
0.00178059, 0, 1.0202,3.08081
0.00174533, 0, 0.999998, 5

这是正确的。

那么,我做错了什么?

提前致谢!

最佳答案

       ret[i][j] = left[i][0] * right[0][j] +
left[i][1] * right[1][j] +
left[i][2] * right[2][j] +
left[i][3] * right[3][j];

GLM 使用列优先矩阵。因此,left[0] 是第一列。您正在 lhs 矩阵的列和 rhs 矩阵的行之间进行点积。那是倒退;它是行 * 列。

您可能做错的是以行为主的方式错误地构建矩阵。

关于c++ - glm::mat4 * glm::mat4 产生不正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38425088/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com