OpenGL - 从 Matrix 4x4 本地向上和向右?
OpenGL - Local Up and Right From Matrix 4x4?
我有一个按以下方式构建的 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);
其中旋转、位置、比例、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]);
所有这些方向都被归一化了。然后,我使用这些说明来获取视图矩阵,如下所示:
glm::lookAt(position, position + forward, up);
一切都很好——除了:当我在一个场景中飞行时,右向量和上向量完全错误。前进的方向总是恰如其分。当我在 0, 0, -1 处看着 0,0,0 时,所有方向都是正确的。但是当我从不同的方向看时(除了从0,0,-1看原点的逆向),right和up是不一致的。它们不是世界向量,也不是局部向量。它们似乎几乎是随机的。我哪里错了?如何从 4x4 变换矩阵中获得一致的局部向上和局部右向量?
matrix
是局部到世界的转换,而视图矩阵是世界到局部的,这意味着在这种情况下 matrix
是 逆 的视图矩阵。您当前拥有的代码仅适用于视图矩阵。只需交换行和列:
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)
的一个可能原因是视图矩阵的 rotation/scaling 部分看起来像:
1 0 0
0 0 1
0 1 0
matrix
对应的部分就是上面的倒数,当然是一模一样的。换个方向试试
我有一个按以下方式构建的 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);
其中旋转、位置、比例、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]);
所有这些方向都被归一化了。然后,我使用这些说明来获取视图矩阵,如下所示:
glm::lookAt(position, position + forward, up);
一切都很好——除了:当我在一个场景中飞行时,右向量和上向量完全错误。前进的方向总是恰如其分。当我在 0, 0, -1 处看着 0,0,0 时,所有方向都是正确的。但是当我从不同的方向看时(除了从0,0,-1看原点的逆向),right和up是不一致的。它们不是世界向量,也不是局部向量。它们似乎几乎是随机的。我哪里错了?如何从 4x4 变换矩阵中获得一致的局部向上和局部右向量?
matrix
是局部到世界的转换,而视图矩阵是世界到局部的,这意味着在这种情况下 matrix
是 逆 的视图矩阵。您当前拥有的代码仅适用于视图矩阵。只需交换行和列:
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)
的一个可能原因是视图矩阵的 rotation/scaling 部分看起来像:
1 0 0
0 0 1
0 1 0
matrix
对应的部分就是上面的倒数,当然是一模一样的。换个方向试试