C++ OpenGL GLUT如何正确旋转房屋并修复背景显示黑色问题
问题原因及修复方案
1. 窗口全黑问题
两个直接原因:
- 你只在初始化时设置了清空颜色
glClearColor(1.0,1.0,1.0,0),但渲染函数render中没有调用glClear(GL_COLOR_BUFFER_BIT)执行清空操作,颜色缓冲区初始值为黑色,所以窗口默认全黑。 - 你将房屋绘制颜色设为了白色,就算清屏生效,白色线条和白色背景完全重合,也看不到任何图形,需要把房屋颜色改为其他可区分的颜色(比如黑色)。
2. 旋转位移表现错误问题
你当前的变换逻辑存在三个明显问题:
- 平移量过小:每次调用
glTranslatef仅平移1个单位,而你的正交投影X轴范围总宽度为205个单位,5个房子几乎完全重叠,无法区分。 - 变换顺序错误:OpenGL矩阵变换是右乘逻辑,代码中你先平移再旋转,且没有重置矩阵,多个变换会叠加,最终房屋位置完全偏离预期。
- 旋转锚点错误:默认绕坐标系原点旋转,而非房屋自身中心,旋转后房屋会飞出可视范围。
修正后完整代码
#include <GL/glut.h> typedef int vert2D[2]; void initialize() { glClearColor(1.0, 1.0, 1.0, 0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 400.0, 0.0, 300.0); // 调整正交范围适配多个房屋显示 glMatrixMode(GL_MODELVIEW); } void drawHouse(vert2D* sq, vert2D* tri) { glColor3f(0.0, 0.0, 0.0); // 房屋改为黑色,适配白色背景 glBegin(GL_LINE_LOOP); glVertex2iv(sq[0]); glVertex2iv(sq[1]); glVertex2iv(sq[2]); glVertex2iv(sq[3]); glEnd(); glBegin(GL_LINE_LOOP); glVertex2iv(tri[0]); glVertex2iv(tri[1]); glVertex2iv(tri[2]); glEnd(); } void render() { // 基准房屋顶点坐标,以自身中心为原点计算,方便旋转 vert2D sqPts[4] = { {15, 12.5}, {15, -12.5}, {0,-12.5}, {0,12.5} }; vert2D triPts[3] = { {20, 12.5}, {-5,12.5}, {7.5,22.5} }; glClear(GL_COLOR_BUFFER_BIT); // 新增清空颜色缓冲区 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 重置模型视图矩阵 // 绘制5个房屋,每个单独控制变换,避免叠加 float baseX = 50; // 第一个房屋X坐标 float spacing = 70; // 房屋横向间距 float angles[5] = {20, 10, 0, -10, -20}; // 对应5个房屋的旋转角度 for(int i=0; i<5; i++){ glPushMatrix(); // 先平移到目标位置,再旋转 glTranslatef(baseX + i*spacing, 150, 0); glRotatef(angles[i], 0, 0, 1); drawHouse(sqPts, triPts); glPopMatrix(); } glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(640, 480); glutCreateWindow("TestMeOut"); initialize(); glutDisplayFunc(render); glutMainLoop(); }
内容的提问来源于stack exchange,提问作者kwikmatt
相关产品推荐
相关产品推荐

