我有一个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]);
在这里,所有这些方向都被标准化。然后我使用这些方向来获取视图矩阵,如下所示:
glm::lookAt(position, position + forward, up);
一切都很完美——除了一个问题:当我在场景中飞行时,右向量和上向量是完全错误的。前向方向总是准确的。当我在0,0,-1处看向0,0,0时,所有方向都是正确的。但是,当我朝不同的方向看(除了从0,0,-1看向原点的逆向),右向量和上向量就不一致了。它们既不是世界向量,也不是本地向量。它们似乎几乎是随机的。我做错了什么?如何从4x4变换矩阵中获得一致的本地上向量和本地右向量?