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%的间隙”,正确逻辑应为:
- 先将立方体缩放到
0.1*0.99=0.099的目标边长 - 平移步长设为
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
相关产品推荐
相关产品推荐

