如何使用 glm::mat4 手写正确的旋转矩阵?
How to correctly write rotation matrices by hand using glm::mat4?
我正在编写一个 OpenGL 程序,对于该程序,我正在尝试手动编写一些旋转矩阵(我知道 glm::rotate
,但这是针对 class,等等我无法使用该功能),但它似乎并没有像我预期的那样工作。
我正在绘制一个场景,停车场和汽车的轮胎是分开绘制的,轮胎随着相机移动而不是停留在原地:
正如你所看到的,轮胎稍微向内旋转,看起来像。
编辑:此外,它似乎在绘制其他对象(旋转的)时倾斜它们:
注意高度倾斜的建筑物。
据我了解,旋转矩阵应该是这样的:
这就是我在代码中所做的(为简洁起见省略了有关平移和缩放的部分):
//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
,所以我想知道我对旋转矩阵的构造方式有什么误解。我很确定 []
的顺序是正确的,因为我可以使用相同的符号手动构造用于平移和缩放的矩阵,并且它正确地缩放和移动对象。
编辑:注意这些变换矩阵是针对物体的,不是相机。
您正在修改错误的矩阵
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
。
我正在编写一个 OpenGL 程序,对于该程序,我正在尝试手动编写一些旋转矩阵(我知道 glm::rotate
,但这是针对 class,等等我无法使用该功能),但它似乎并没有像我预期的那样工作。
我正在绘制一个场景,停车场和汽车的轮胎是分开绘制的,轮胎随着相机移动而不是停留在原地:
编辑:此外,它似乎在绘制其他对象(旋转的)时倾斜它们:
据我了解,旋转矩阵应该是这样的:
这就是我在代码中所做的(为简洁起见省略了有关平移和缩放的部分):
//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
,所以我想知道我对旋转矩阵的构造方式有什么误解。我很确定 []
的顺序是正确的,因为我可以使用相同的符号手动构造用于平移和缩放的矩阵,并且它正确地缩放和移动对象。
编辑:注意这些变换矩阵是针对物体的,不是相机。
您正在修改错误的矩阵
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
。