gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:15:40 26 4
gpt4 key购买 nike

在找出我之前 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 矩阵按预期工作。

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
}

最佳答案

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

相机矩阵从世界空间变换到相机空间。因此,从相机空间看,相机矩阵的基 vector 是世界空间的基 vector 。不是相机空间的基 vector 。

相机相对于世界空间的方向是此转换的。由于旋转矩阵的逆是转置,所以您遇到了问题。

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

关于c++ - GLM - 方向矩阵正在创建行主矩阵而不是列主矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com