import pygame import math import time from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import * # 初始化 Pygame pygame.init() # 设置窗口大小 width, height = 800, 600 display = pygame.display.set_mode((width, height), DOUBLEBUF | OPENGL) pygame.display.set_caption('3D Yellow Ball') # 启用深度测试 glEnable(GL_DEPTH_TEST) # 设置背景色 glClearColor(0.1, 0.1, 0.1, 1.0) # 设置光照 glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) # 设置光源位置 light_position = [2.0, 2.0, 2.0, 1.0] # 点光源 glLightfv(GL_LIGHT0, GL_POSITION, light_position) # 设置光源颜色 light_ambient = [0.3, 0.3, 0.3, 1.0] light_diffuse = [1.0, 1.0, 1.0, 1.0] light_specular = [1.0, 1.0, 1.0, 1.0] glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient) glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse) glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular) # 设置视角 gluPerspective(45, (width/height), 0.1, 50.0) # 移动相机 glTranslatef(0.0, 0.0, -5) # 旋转角度 angle = 0.0 # 主循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 清除屏幕 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 旋转整个场景 glRotatef(1, 1, 1, 1) # 黄色材质(完整设置) yellow = [1.0, 1.0, 0.0, 1.0] yellow_ambient = [0.3, 0.3, 0.0, 1.0] yellow_specular = [1.0, 1.0, 0.5, 1.0] shininess = [50.0] glMaterialfv(GL_FRONT, GL_AMBIENT, yellow_ambient) glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow) glMaterialfv(GL_FRONT, GL_SPECULAR, yellow_specular) glMaterialfv(GL_FRONT, GL_SHININESS, shininess) # 创建二次曲面 → 画光滑球 quad = gluNewQuadric() gluQuadricNormals(quad, GLU_SMOOTH) gluSphere(quad, 1.0, 50, 50) gluDeleteQuadric(quad) # 交换缓冲区 pygame.display.flip() # 控制帧率 pygame.time.wait(10) # 更新角度 angle += 1 # 退出 Pygame pygame.quit()