Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLM-方向矩阵正在创建行主矩阵而不是列主矩阵?_C++_Math_Matrix - Fatal编程技术网

C++ GLM-方向矩阵正在创建行主矩阵而不是列主矩阵?

C++ GLM-方向矩阵正在创建行主矩阵而不是列主矩阵?,c++,math,matrix,C++,Math,Matrix,在找出我之前的答案后,我发现原因是某种数学上的古怪 使用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(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
使用方向时,为什么旋转矩阵从列主方向翻转到行主方向(转置?)

编辑:


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

摄影机矩阵从世界空间变换到摄影机空间。因此,摄像机矩阵的基向量是从摄像机空间看到的世界空间的基向量。不是摄影机空间的基向量

相机相对于世界空间的方向与此变换相反。既然旋转矩阵的逆矩阵是转置矩阵,你就有问题了


问题不在于矩阵;问题在于你认为矩阵所说的和它实际所说的之间的差异。

是什么让你说它被翻转了?这是一个旋转矩阵;它的转置也是它的逆。这意味着你可能只是在看旋转方向,而不是你所期望的。另外,请停止使用欧拉角。是的,即使你使用四元数,你仍然在使用它们。你为什么说它被翻转了?仅当使用行主方法访问时,旋转轴才正确。它们不是以列主方式存储的,考虑到该库涉及OpenGL,这很奇怪。另外,请停止使用Euler角。你能给我举一个不使用欧拉角的例子吗?等我理解了之后,我会实现它。@Nicolas我也想知道使用四元数的欧拉角的替代方法;由于四元数基本上表示为轴向量和围绕该向量的旋转角度(x、y、z、w),这可能解释了为什么库中有这么多四元数生成函数采用规则角度。如果你提到了一个更好的方法,了解它是什么会很有帮助。
// 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
}