【问题标题】:How to properly rotate and scale an object in OpenGL?如何在 OpenGL 中正确旋转和缩放对象?
【发布时间】:2019-03-07 21:19:54
【问题描述】:

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

这就是我正在做的事情:

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;

【问题讨论】:

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


    【解决方案1】:

    从 GLM quaternion.hppquat_cast 它说

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

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

    【讨论】:

    • 我猜我是在混合缩放信息和旋转。感谢您清除它。我按照您的建议删除了最后一行并添加了my_models[i].Quat = rotate(my_models[i].Quat, my_models[i].angle * t, my_models[i].animation_axis[0]);,它运行良好。
    猜你喜欢
    • 1970-01-01
    • 2020-10-20
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2018-04-19
    相关资源
    最近更新 更多