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