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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:27:02