import pygame import math 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 Sphere') # 启用深度测试 glEnable(GL_DEPTH_TEST) # 设置光照 glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) # 设置光源位置 light_position = [1.0, 1.0, 1.0, 0.0] # directional light glLightfv(GL_LIGHT0, GL_POSITION, light_position) # 设置材质属性 material_ambient = [0.3, 0.7, 0.3, 1.0] material_specular = [0.3, 0.7, 0.3, 1.0] material_shininess = [50.0] glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient) glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular) glMaterialfv(GL_FRONT, GL_SHININESS, material_shininess) # 设置视角 gluPerspective(45, (width/height), 0.1, 50.0) # 移动相机 glTranslatef(0.0, 0.0, -5) # 初始化3个绿球的角度 ball_angles = [0, 120, 240] # 三个绿球的初始角度 ball_radius = 0.5 # 绿球的半径 distance = 2.5 # 绿球到黄球的距离 # 主循环 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, 3, 1, 1) # 绘制黄球(中心球) glMaterialfv(GL_FRONT, GL_DIFFUSE, [1.0, 1.0, 0.0, 1.0]) # 黄色 quad = gluNewQuadric() gluQuadricNormals(quad, GLU_SMOOTH) gluSphere(quad, 1, 32, 32) gluDeleteQuadric(quad) # 绘制3个绿球和连线 glMaterialfv(GL_FRONT, GL_DIFFUSE, [0.0, 1.0, 0.0, 1.0]) # 绿色 for i, angle in enumerate(ball_angles): # 计算绿球位置 angle_rad = math.radians(angle) x = distance * math.cos(angle_rad) y = distance * math.sin(angle_rad) z = 0 # 绘制连线(连接到中心黄球) glBegin(GL_LINES) glVertex3f(0, 0, 0) # 中心黄球位置 glVertex3f(x, y, z) # 绿球位置 glEnd() # 保存当前矩阵 glPushMatrix() # 移动到绿球位置 glTranslatef(x, y, z) # 绘制绿球 quad = gluNewQuadric() gluQuadricNormals(quad, GLU_SMOOTH) gluSphere(quad, ball_radius, 16, 16) gluDeleteQuadric(quad) # 恢复矩阵 glPopMatrix() # 更新绿球角度 ball_angles[i] = (angle + 1) % 360 # 交换缓冲区 pygame.display.flip() # 控制帧率 pygame.time.wait(10) # 退出 Pygame pygame.quit()