如何在OpenGL中正确旋转和缩放对象?

时间:2018-10-02 17:37:48

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

我正在尝试每帧构建模型矩阵,为此,我正在创建一个平移,旋转和缩放矩阵并将其相乘。但我似乎无法弄清楚它如何构建旋转矩阵并正确缩放比例。

这就是我在做什么:

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;

1 个答案:

答案 0 :(得分:2)

从GLM quaternion.hppquat_cast,它说

  

将纯旋转4 * 4矩阵转换为四元数。

您要在其中设置整个模型矩阵,该模型矩阵也具有比例和平移。实际上,我根本不知道为什么要将矩阵转换为四元数。因此,如果要应用旋转,则可以删除最后一行(quat_cast)并直接更新四元数。

相关问题