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

OpenGL中3D立方体网格间隙不显示问题求助

立方体网格间隙未显示的问题排查

核心原因分析

  • 平移步长与立方体实际尺寸不匹配
    你的代码中,立方体X轴平移步长为0.1*(i%8)、Y轴为-0.1*(i/8),但如果drawCube()绘制的是边长为1的立方体(比如顶点定义在[-0.5, 0.5]区间),缩放0.99后实际边长为0.99,远大于平移步长0.1,会导致立方体严重重叠,间隙完全被覆盖。

    若要实现“立方体尺寸0.1%的间隙”,正确逻辑应为:

    1. 先将立方体缩放到0.1*0.99=0.099的目标边长
    2. 平移步长设为0.1(原始立方体尺寸),此时相邻立方体的间隙为0.1-0.099=0.001,符合预期。
  • OpenGL绘制状态错误
    代码中drawCube()后调用了多余的glEnd(),若drawCube()内部已包含glBegin()与glEnd()的配对调用,额外的glEnd()会破坏OpenGL绘制状态,可能引发绘制异常。

修复后的关键代码示例

void drawBoard()
{
    // 初始化立方体与网格
    cube = (Cube)malloc(sizeof(struct cube));
    cube->x = 0.0;
    cube->y = 0.0;
    cube->z = 0.0;
    cube->scale = 1;

    board = (Cube*)malloc(sizeof(Cube)*64);
    for(int i=0; i<64; i++) {
        board[i] = (Cube)malloc(sizeof(struct cube));
        board[i]->x = 0.1*(i%8); // 步长对应原始立方体尺寸0.1
        board[i]->y = -0.1*(i/8);
        board[i]->z = 0.0;
        board[i]->scale = 0.1 * 0.99; // 缩放至带间隙的目标尺寸
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
    glTranslatef(cube->x, cube->y, cube->z);

    // 绘制立方体网格
    for(int i=0; i<64; i++) {
        glPushMatrix();
        glTranslatef(board[i]->x, board[i]->y, board[i]->z);
        glScalef(board[i]->scale, board[i]->scale, board[i]->scale);

        drawCube();
        glPopMatrix();
    }
    glPopMatrix();
    glFlush();

    // 释放内存,避免泄漏
    free(cube);
    for(int i=0; i<64; i++) {
        free(board[i]);
    }
    free(board);
}

额外注意事项

  • 确认drawCube()的顶点区间:若立方体顶点定义在[0,1]而非[-0.5,0.5],需调整缩放和平移的计算逻辑,保证步长与缩放后尺寸匹配。
  • 避免重复内存分配:当前代码每次调用drawBoard()都会重新分配内存且未释放,需将初始化逻辑移至外部,或在函数末尾添加释放代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:30:35