| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 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()
|