OpenGL使用GLM旋转时1-2弧度区间模型矩阵重置为单位矩阵问题
结论
这不是GLM库的问题,完全是你的代码逻辑错误导致的。
具体错误点
冗余的重复渲染提交逻辑
你连续两次给渲染器设置模型矩阵,第二次设置时调用的glm::translate(applied_transformation, glm::vec3(0.0f))本质是给原有矩阵右乘一个单位平移矩阵,不会对矩阵产生任何修改,完全达不到你注释中说的“复位平移分量”的效果。如果你的update_renderer函数中包含对旋转参数的重置逻辑,这步多余的操作就是导致角度异常复位的直接诱因。绕局部原点旋转的理解错误
你当前的变换顺序translate * rotate * scale本身就是绕物体局部原点旋转的正确写法(矩阵对顶点生效的顺序是先缩放、再绕原点旋转、最后平移到世界坐标,旋转中心就是物体自身的局部原点),完全不需要额外的平移清零操作。旋转角累加逻辑存在问题
你描述的“角度到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
相关产品推荐
相关产品推荐

