GLM - 来自方向的矩阵是创建行主要而不是列主要矩阵?

时间:2012-08-30 23:13:54

标签: c++ math matrix

在弄清楚我之前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
}

1 个答案:

答案 0 :(得分:7)

从空间A变换到空间B的矩阵M具有空间A的基矢量,但是相对于空间B表示。

相机矩阵从世界空间转换到相机空间。因此,从相机空间看,相机矩阵的基矢量是世界空间的基矢量。不是相机空间的基础向量。

相机相对于世界空间的方向是此转换的。而且由于旋转矩阵的反转是转置,所以你有问题。

问题不在于矩阵;问题在于你认为矩阵所说的与实际所说的内容之间存在差异。