在找出我之前question的答案后,我发现原因是某种数学上的奇怪之处。
我使用GLM (OpenGL)库创建了一个方向,如下所示
glm::gtx::quaternion::orientation =
glm::gtx::quaternion::angleAxis(pitchAccum, 1.0f, 0.0f, 0.0f) *
glm::gtx::quaternion::angleAxis(yawAccum, 0.0f, 1.0f, 0.0f);
现在,如果我从这个方向创建一个矩阵,它不再是列主要的,而是以某种方式成为行主要的
glm::mat4 view = glm::gtx::quaternion::toMat4(orientation);
换句话说,3个坐标轴是通过使用行主索引访问矩阵来找到的
view[0][0], view[1][0], view[2][0] // X axis
view[0][1], view[1][1], view[2][1] // Y axis
view[0][2], view[1][2], view[2][2] // Z axis
换句话说,旋转部分的转置。
矩阵的转换部分仍应使用主要列进行设置,以便最终视图矩阵按预期方式工作。
view[3][0] = -glm::dot(glm::vec3(view[0][0], view[1][0], view[2][0]), position); // Right
view[3][1] = -glm::dot(glm::vec3(view[0][1], view[1][1], view[2][1]), position); // Up
view[3][2] = -glm::dot(glm::vec3(view[0][2], view[1][2], view[2][2]), position); // Forward
为什么旋转矩阵从列主要部分翻转到行主要部分(转置?)什么时候使用方向?
编辑:
// Move forward
if (glfwGetKey('W') == GLFW_PRESS)
{
//movement += glm::vec3(view[2][0], view[2][1], view[2][2]); // incorrect
movement += -glm::vec3(view[0][2], view[1][2], view[2][2]); // correct
}
// Move backward
if (glfwGetKey('S') == GLFW_PRESS)
{
//movement += -glm::vec3(view[2][0], view[2][1], view[2][2]); // incorrect
movement += glm::vec3(view[0][2], view[1][2], view[2][2]); // correct
}
// Strafe left
if (glfwGetKey('A') == GLFW_PRESS)
{
//movement += -glm::vec3(view[0][0], view[0][1], view[0][2]); // incorrect
movement += -glm::vec3(view[0][0], view[1][0], view[2][0]); // correct
}
// Strafe right
if (glfwGetKey('D') == GLFW_PRESS)
{
//movement += glm::vec3(view[0][0], view[0][1], view[0][2]); // incorrect
movement += glm::vec3(view[0][0], view[1][0], view[2][0]); // correct
}
发布于 2012-08-31 01:41:31
从空间A变换到空间B的矩阵M具有空间A的基向量,但表示为相对于空间B。
摄影机矩阵从世界空间变换到摄影机空间。因此,从摄影机空间看,摄影机矩阵的基向量是世界空间的基向量。而不是相机空间的基向量。
摄影机相对于世界空间的方向与此变换相反。因为旋转矩阵的逆是它的转置,所以你有你的问题。
问题不在于矩阵;问题在于您认为矩阵所说的内容和它实际所说的内容之间的差异。
https://stackoverflow.com/questions/12206908
复制相似问题