如何在 OpenGL 中正确旋转和缩放对象?
How to properly rotate and scale an object in OpenGL?
我试图在每一帧构建模型矩阵,为此我正在创建平移、旋转和缩放矩阵并将其相乘。但我似乎无法弄清楚如何构建旋转矩阵并正确缩放它。
这是我正在做的事情:
glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0);
glm:mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);
rotateM = mat4_cast(my_models[i].Quat);
rotateM = glm::rotate(rotateM, (float) my_models[i].angle * t, my_models[i].animation_axis[0]);
my_models[i].modelMatrix = translate * rotateM *scale;
my_models[i].Quat = quat_cast(my_models[i].modelMatrix);
在我使用的构造函数中:
quat Quat = glm::angleAxis(glm::radians(90.f), glm::vec3(0.f, 1.f, 0.f));
如果 my_models[i].myscale 刚好是 1.0f,它旋转得很好,但如果它更大,对象会继续增长并奇怪地旋转。四元数对我来说很新,所以我假设我搞砸了。
我错过了什么?有没有更简单的方法来构建模型旋转矩阵?如果是这样,我应该保存哪些信息?
编辑:
正如 jparima 所建议的,以下解决了我的问题。
glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0);
glm::mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);
my_models[i].Quat = rotate(my_models[i].Quat, my_models[i].angle * t, my_models[i].animation_axis[0]);
rotateM = mat4_cast(my_models[i].Quat);
my_models[i].modelMatrix = translate * rotateM * scale;
来自 quat_cast
的 GLM quaternion.hpp 它说
Converts a pure rotation 4 * 4 matrix to a quaternion.
你在那里设置了整个模型矩阵,它也有缩放和平移。事实上,我根本不知道你为什么要将矩阵转换为四元数。因此,如果您想应用旋转,您可以删除最后一行 (quat_cast
) 并直接更新四元数。
我试图在每一帧构建模型矩阵,为此我正在创建平移、旋转和缩放矩阵并将其相乘。但我似乎无法弄清楚如何构建旋转矩阵并正确缩放它。
这是我正在做的事情:
glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0);
glm:mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);
rotateM = mat4_cast(my_models[i].Quat);
rotateM = glm::rotate(rotateM, (float) my_models[i].angle * t, my_models[i].animation_axis[0]);
my_models[i].modelMatrix = translate * rotateM *scale;
my_models[i].Quat = quat_cast(my_models[i].modelMatrix);
在我使用的构造函数中:
quat Quat = glm::angleAxis(glm::radians(90.f), glm::vec3(0.f, 1.f, 0.f));
如果 my_models[i].myscale 刚好是 1.0f,它旋转得很好,但如果它更大,对象会继续增长并奇怪地旋转。四元数对我来说很新,所以我假设我搞砸了。
我错过了什么?有没有更简单的方法来构建模型旋转矩阵?如果是这样,我应该保存哪些信息?
编辑: 正如 jparima 所建议的,以下解决了我的问题。
glm::mat4 scale = glm::scale(mat4(1.0f), my_models[i].myscale);
glm::mat4 rotateM(1.0);
glm::mat4 translate = glm::translate(mat4(1.0f), my_models[i].initialPos);
my_models[i].Quat = rotate(my_models[i].Quat, my_models[i].angle * t, my_models[i].animation_axis[0]);
rotateM = mat4_cast(my_models[i].Quat);
my_models[i].modelMatrix = translate * rotateM * scale;
来自 quat_cast
的 GLM quaternion.hpp 它说
Converts a pure rotation 4 * 4 matrix to a quaternion.
你在那里设置了整个模型矩阵,它也有缩放和平移。事实上,我根本不知道你为什么要将矩阵转换为四元数。因此,如果您想应用旋转,您可以删除最后一行 (quat_cast
) 并直接更新四元数。