小编Ska*_*rab的帖子

OpenGL - 矩阵 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);
Run Code Online (Sandbox Code Playgroud)

其中旋转、位置、缩放、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]);
Run Code Online (Sandbox Code Playgroud)

所有这些方向都被归一化。然后我使用这些方向来获得一个视图矩阵,如下所示:

glm::lookAt(position, position + forward, up);
Run Code Online (Sandbox Code Playgroud)

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

c++ opengl matrix quaternions glm-math

4
推荐指数
1
解决办法
1357
查看次数

标签 统计

c++ ×1

glm-math ×1

matrix ×1

opengl ×1

quaternions ×1