You need to enable JavaScript to run this app. C++ OpenGL中使用glm::rotate旋转纹理出现单三角形渲染异常问题求助
优惠活动
大模型
产品
解决方案
定价
更多

C++ OpenGL中使用glm::rotate旋转纹理出现单三角形渲染异常问题求助

旋转异常的核心原因

你的代码存在几处明确的错误,直接导致了图元显示异常:

  • 图元绘制参数与顶点数不匹配
    你一共只有4个顶点组成矩形,却在glDrawElements里传入了6个索引值、用三角形条带模式绘制。三角形条带每多一个索引就会生成一个新三角形,4个顶点只需要4个索引就能拼成完整矩形,多出来的2个索引没有对应有效顶点数据,会触发显存越界读取,生成位置随机的异常三角形,视觉上就会误以为“只有一个三角形完成了变换”。
    正确的绘制调用是:
    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, nullptr);
  • 旋转轴参数输入错误
    你在调用glm::rotate时写的旋转轴是glm::vec3(1.f),按照GLM的构造规则,这会生成三个分量全为1的斜向轴(1,1,1),根本不是你想要的垂直于屏幕的Z轴方向(0,0,1)。绕斜轴旋转时,原本在Z=0平面的矩形会产生Z方向的位置偏移,结合你设置的正交投影裁剪范围(Z值在0到1之间的内容才会被显示),超出范围的顶点会被直接裁剪,进一步让显示结果混乱。
    正确的旋转轴参数应该写为glm::vec3(0.0f, 0.0f, 1.0f)。
  • 旋转的逻辑顺序完全不对
    你现在的变换是先做了0.5、-0.5单位的微小平移,再绕全局坐标原点旋转,既没有让矩形绕自身中心旋转,微小的平移量也根本抵消不了绕远点旋转带来的位置偏移。
    想要让矩形绕自己的中心旋转,必须按照固定顺序构建变换矩阵:
    1. 先把矩形的中心平移到坐标原点,这样后续的旋转操作才会围绕中心进行。你的矩形顶点范围是X从100到400、Y从100到400,中心坐标是(250,250)。
    2. 完成旋转操作。
    3. 再把旋转后的矩形平移回原来的中心位置。
      正确的构建示例:
    glm::vec3 rectCenter(250.0f, 250.0f, 0.0f);
    glm::mat4 trans = glm::mat4(1.0f);
    // 移到原点
    trans = glm::translate(trans, -rectCenter);
    // 绕Z轴旋转,需要每帧累加角度才能实现动态旋转效果
    trans = glm::rotate(trans, glm::radians(currentRotateAngle), glm::vec3(0,0,1));
    // 移回原位
    trans = glm::translate(trans, rectCenter);
    // 合并投影和模型矩阵
    glm::mat4 mvp = proj * trans;
    glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(mvp));
    
  • 没有累加旋转角度
    你现在固定用1度的旋转角度,即使变换逻辑正确,也只会看到矩形静止在旋转1度的位置,不会有连续旋转的动态效果,只需要在每帧更新时给角度值加上固定的增量(比如1度)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 00:27:03