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

PyOpenGL程序无法显示可旋转3D立方体问题求助

3D立方体程序空白屏幕问题修复

问题分析

你的代码存在几处关键逻辑错误,导致在笔记本上无法正常显示立方体,具体问题如下:

  • 主循环位置错误,渲染与输入响应逻辑未形成持续循环
  • 旋转函数参数使用错误,无法正确应用旋转效果
  • 未开启深度测试,显卡渲染顺序异常
  • 线条颜色未显式设置,可能与背景色重合
  • 退出事件处理逻辑错误,存在变量未定义风险

修正后的代码

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

pygame.init()

display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
pygame.display.set_caption("03 lab 1")

# 初始化透视投影
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(0, 0, -5)

# 开启深度测试,解决渲染遮挡问题
glEnable(GL_DEPTH_TEST)

# 旋转角度累积值
rotate_x = 0
rotate_y = 0

def draw_cube():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    # 设置线条为白色,确保与黑色背景区分
    glColor3f(1.0, 1.0, 1.0)
    glBegin(GL_LINES)
    # 前面四条边
    glVertex3f(-0.5, 0.5, 0)
    glVertex3f(-0.5, -0.5, 0)
    glVertex3f(-0.5, -0.5, 0)
    glVertex3f(0.5, -0.5, 0)
    glVertex3f(0.5, -0.5, 0)
    glVertex3f(0.5, 0.5, 0)
    glVertex3f(0.5, 0.5, 0)
    glVertex3f(-0.5, 0.5, 0)

    # 后面四条边
    glVertex3f(-0.5, 0.5, 1)
    glVertex3f(-0.5, -0.5, 1)
    glVertex3f(-0.5, -0.5, 1)
    glVertex3f(0.5, -0.5, 1)
    glVertex3f(0.5, -0.5, 1)
    glVertex3f(0.5, 0.5, 1)
    glVertex3f(0.5, 0.5, 1)
    glVertex3f(-0.5, 0.5, 1)

    # 连接前后的四条边
    glVertex3f(-0.5, 0.5, 0)
    glVertex3f(-0.5, 0.5, 1)
    glVertex3f(0.5, 0.5, 0)
    glVertex3f(0.5, 0.5, 1)
    glVertex3f(-0.5, -0.5, 0)
    glVertex3f(-0.5, -0.5, 1)
    glVertex3f(0.5, -0.5, 0)
    glVertex3f(0.5, -0.5, 1)
    glEnd()

# 主循环放在全局作用域,持续处理事件、渲染画面
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                rotate_y -= 5
            if event.key == pygame.K_RIGHT:
                rotate_y += 5
            if event.key == pygame.K_UP:
                rotate_x -= 5
            if event.key == pygame.K_DOWN:
                rotate_x += 5

    # 重置模型视图矩阵,避免旋转累积异常
    glLoadIdentity()
    # 重新应用平移(因为glLoadIdentity会重置所有变换)
    glTranslatef(0, 0, -5)
    # 应用X轴和Y轴旋转
    glRotatef(rotate_x, 1, 0, 0)
    glRotatef(rotate_y, 0, 1, 0)
    
    draw_cube()
    pygame.display.flip()
    pygame.time.wait(15)

关键修正说明

  1. 调整主循环位置:将主循环移至全局作用域,确保持续处理事件、更新旋转角度、渲染画面。
  2. 修正旋转逻辑:使用glLoadIdentity()重置矩阵,避免旋转累积导致的异常;用glRotatef(角度值, 轴分量)的正确方式应用X/Y轴旋转,同时增大角度步长(从1改为5)让旋转效果更明显。
  3. 开启深度测试:添加glEnable(GL_DEPTH_TEST)确保图形按正确的深度顺序渲染,适配不同显卡的渲染规则。
  4. 设置线条颜色:用glColor3f(1.0,1.0,1.0)将线条设为白色,与默认黑色背景形成对比,确保立方体可见。
  5. 修复事件处理:将退出事件的判断移至事件循环内部,避免变量未定义错误。

内容的提问来源于stack exchange,提问作者Ai-Yue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:01:11