You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL使用GLM旋转时1-2弧度区间模型矩阵重置为单位矩阵问题

结论

这不是GLM库的问题,完全是你的代码逻辑错误导致的。

具体错误点

  1. 冗余的重复渲染提交逻辑
    你连续两次给渲染器设置模型矩阵,第二次设置时调用的glm::translate(applied_transformation, glm::vec3(0.0f))本质是给原有矩阵右乘一个单位平移矩阵,不会对矩阵产生任何修改,完全达不到你注释中说的“复位平移分量”的效果。如果你的update_renderer函数中包含对旋转参数的重置逻辑,这步多余的操作就是导致角度异常复位的直接诱因。

  2. 绕局部原点旋转的理解错误
    你当前的变换顺序translate * rotate * scale本身就是绕物体局部原点旋转的正确写法(矩阵对顶点生效的顺序是先缩放、再绕原点旋转、最后平移到世界坐标,旋转中心就是物体自身的局部原点),完全不需要额外的平移清零操作。

  3. 旋转角累加逻辑存在问题
    你描述的“角度到1弧度复位、2弧度恢复正常”的现象,大概率是active_rotation.z的存储类型或者累加逻辑有问题。比如错误地使用了长度不足的数值类型存储角度、或者在累加代码中加入了错误的区间判断截断了角度值,检查所有修改active_rotation.z的代码即可定位。

修正后的代码

void defshape::apply_transformations() {
    glm::mat4 applied_transformation = glm::mat4(1.0f);

    applied_transformation = glm::translate(applied_transformation, active_translation);
    applied_transformation = glm::rotate(applied_transformation, active_rotation.z, glm::vec3(0, 0, 1));
    applied_transformation = glm::scale(applied_transformation, active_scaling);

    renderer_handle->model_matrix = applied_transformation;
    renderer_handle->update_renderer();

    // 删除后续多余的平移清零、重复设置矩阵的代码
}

如果你确实需要单独获取没有平移分量的变换矩阵,正确的写法是直接修改矩阵的位移列,不要使用glm::translate:

applied_transformation[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);

内容的提问来源于stack exchange,提问作者kosude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:24:03