ball-demo.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import pygame
  2. import math
  3. import time
  4. from pygame.locals import *
  5. from OpenGL.GL import *
  6. from OpenGL.GLU import *
  7. # 初始化 Pygame
  8. pygame.init()
  9. # 设置窗口大小
  10. width, height = 800, 600
  11. display = pygame.display.set_mode((width, height), DOUBLEBUF | OPENGL)
  12. pygame.display.set_caption('3D Yellow Ball')
  13. # 启用深度测试
  14. glEnable(GL_DEPTH_TEST)
  15. # 设置背景色
  16. glClearColor(0.1, 0.1, 0.1, 1.0)
  17. # 设置光照
  18. glEnable(GL_LIGHTING)
  19. glEnable(GL_LIGHT0)
  20. # 设置光源位置
  21. light_position = [2.0, 2.0, 2.0, 1.0] # 点光源
  22. glLightfv(GL_LIGHT0, GL_POSITION, light_position)
  23. # 设置光源颜色
  24. light_ambient = [0.3, 0.3, 0.3, 1.0]
  25. light_diffuse = [1.0, 1.0, 1.0, 1.0]
  26. light_specular = [1.0, 1.0, 1.0, 1.0]
  27. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient)
  28. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse)
  29. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular)
  30. # 设置视角
  31. gluPerspective(45, (width/height), 0.1, 50.0)
  32. # 移动相机
  33. glTranslatef(0.0, 0.0, -5)
  34. # 旋转角度
  35. angle = 0.0
  36. # 主循环
  37. running = True
  38. while running:
  39. # 处理事件
  40. for event in pygame.event.get():
  41. if event.type == pygame.QUIT:
  42. running = False
  43. # 清除屏幕
  44. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  45. # 旋转整个场景
  46. glRotatef(1, 1, 1, 1)
  47. # 黄色材质(完整设置)
  48. yellow = [1.0, 1.0, 0.0, 1.0]
  49. yellow_ambient = [0.3, 0.3, 0.0, 1.0]
  50. yellow_specular = [1.0, 1.0, 0.5, 1.0]
  51. shininess = [50.0]
  52. glMaterialfv(GL_FRONT, GL_AMBIENT, yellow_ambient)
  53. glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow)
  54. glMaterialfv(GL_FRONT, GL_SPECULAR, yellow_specular)
  55. glMaterialfv(GL_FRONT, GL_SHININESS, shininess)
  56. # 创建二次曲面 → 画光滑球
  57. quad = gluNewQuadric()
  58. gluQuadricNormals(quad, GLU_SMOOTH)
  59. gluSphere(quad, 1.0, 50, 50)
  60. gluDeleteQuadric(quad)
  61. # 交换缓冲区
  62. pygame.display.flip()
  63. # 控制帧率
  64. pygame.time.wait(10)
  65. # 更新角度
  66. angle += 1
  67. # 退出 Pygame
  68. pygame.quit()