c++ - OpenGL - 从 Matrix 4x4 本地向上和向右?

标签 c++ opengl matrix quaternions glm-math

我有一个按以下方式构建的 4x4 变换矩阵:

glm::mat4 matrix;
glm::quat orientation = toQuaternion(rotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::translate(matrix, position);
matrix= glm::scale(matrix, scale);

orientation = toQuaternion(localRotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::scale(matrix, localScale);

其中 rotation、position、scale、localRotation 和 localScale 都是 vector3 的。根据许多不同论坛上许多不同问题的建议,应该可以像这样从结果矩阵中找出局部方向:

right   = glm::vec3(matrix[0][0], matrix[0][1], matrix[0][2]);
up      = glm::vec3(matrix[1][0], matrix[1][1], matrix[1][2]);
forward = glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]);

所有这些方向都被归一化了。然后,我使用这些说明来获取像这样的 View 矩阵:

glm::lookAt(position, position + forward, up);

一切都很好——除了:当我在一个场景中飞行时,右 vector 和上 vector 是完全错误的。前进的方向总是恰如其分。当我在 0, 0, -1 处看着 0,0,0 时,所有方向都是正确的。但是当我从不同的方向看时(除了从0,0,-1看原点的逆向),right和up是不一致的。它们不是世界 vector ,也不是局部 vector 。它们似乎几乎是随机的。我哪里错了?如何从 4x4 变换矩阵中获得一致的局部向上和局部右 vector ?

最佳答案

matrix 是本地到世界的转换,而 View 矩阵是世界到本地的,这意味着在这种情况下 matrix View 矩阵的逆。您当前拥有的代码仅适用于 View 矩阵。只需交换行和列:

right   = glm::vec3(matrix[0][0], matrix[1][0], matrix[2][0]);
up      = glm::vec3(matrix[0][1], matrix[1][1], matrix[2][1]);
forward = glm::vec3(matrix[0][2], matrix[1][2], matrix[2][2]);

它适用于 (0, -1, 0) 的一个可能原因是 View 矩阵的旋转/缩放部分如下所示:

1 0 0
0 0 1
0 1 0

matrix对应的部分就是上面的逆矩阵,当然是一样的。换个方向试试。

关于c++ - OpenGL - 从 Matrix 4x4 本地向上和向右?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50081475/

相关文章:

c++ - 生成从可执行文件调用的 c++ 方法列表

OpenGL - 为什么我的对象是透明的?

python-2.7 - 如何在 python (numpy) 中更快地计算每行两个矩阵 A 和 B 的外积?

c++ - 使用 `new` 创建字符数组会生成比我指定的更多的字符。 C++

c++ - 什么是函数 __tcf_0? (在使用 gprof 和 g++ 时看到)

c++ - Anttweakbar glfw3 OpenGL 3.2 不绘图

arrays - Matlab:使用较小的数组创建更大的数组

node.js - SVD 和奇异/非奇异矩阵

c++ - 无法从包含 2 列的 txt 文件中读取整数 (C++)

c++ - opengl,如何最好地使用 visual studio 更新标题?