如何使用glm :: mat4手动正确编写旋转矩阵?

时间:2016-10-03 22:58:36

标签: c++ opengl matrix rotation glm-math

我正在编写一个OpenGL程序,对于那个程序,我试图手工编写一些旋转矩阵(我知道glm::rotate,但这是一个类,所以我不能使用该函数) ,但它似乎没有像我想要的那样工作。

我正在画一个停车场的场景和单独画轮胎的车,轮胎正在用相机移动而不是放在下面: car 如您所见,轮胎朝向相机略微旋转,看起来像。

编辑:此外,它们在绘制时似乎会扭曲其他对象(旋转):

skewed 注意高度倾斜的建筑物。

据我了解,这就是旋转矩阵的外观:

matrices

这就是我在代码中所做的(关于翻译和缩放的部分,为了简洁起见):

//glm::mat4 rotXMatrix = glm::rotate(rotation.x, glm::vec3(1, 0, 0));
glm::mat4 rotXMatrix = glm::mat4(1.0f);
rotXMatrix[1][1] = cos(rotation.x);
rotXMatrix[1][2] = sin(rotation.x);
rotXMatrix[2][1] = -sin(rotation.x);
rotXMatrix[2][2] = cos(rotation.x);
//glm::mat4 rotYMatrix = glm::rotate(rotation.y, glm::vec3(0, 1, 0));
glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);
//glm::mat4 rotZMatrix = glm::rotate(rotation.z, glm::vec3(0, 0, 1));
glm::mat4 rotZMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.z);
rotXMatrix[0][1] = sin(rotation.z);
rotXMatrix[1][0] = -sin(rotation.z);
rotXMatrix[1][1] = cos(rotation.z);

glm::mat4 rotMatrix = rotZMatrix * rotYMatrix * rotXMatrix;
return posMatrix * rotMatrix * scaleMatrix;

当我不手动操作时,它正常工作(使用glm::rot,如注释掉的部分所示,所以我想知道我对旋转矩阵的构造方式有什么误解。我是非常确定[]的顺序是正确的,因为我可以使用相同的表示法手工构建用于平移和缩放的矩阵,并且它可以正确地缩放和移动对象。

编辑:请注意,这些转换矩阵适用于对象,不适用于相机。

1 个答案:

答案 0 :(得分:1)

您正在修改错误的矩阵

glm::mat4 rotYMatrix = glm::mat4(1.0f);
rotXMatrix[0][0] = cos(rotation.y);
rotXMatrix[0][2] = -sin(rotation.y);
rotXMatrix[2][0] = sin(rotation.y);
rotXMatrix[2][2] = cos(rotation.y);

您正在构建rotYMatrix,但修改rotXMatrix