opengl3d-demo.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import pygame
  2. import math
  3. from pygame.locals import *
  4. from OpenGL.GL import *
  5. from OpenGL.GLU import *
  6. # 初始化 Pygame
  7. pygame.init()
  8. # 设置窗口大小
  9. width, height = 800, 600
  10. display = pygame.display.set_mode((width, height), DOUBLEBUF | OPENGL)
  11. pygame.display.set_caption('3D Sphere')
  12. # 启用深度测试
  13. glEnable(GL_DEPTH_TEST)
  14. # 设置光照
  15. glEnable(GL_LIGHTING)
  16. glEnable(GL_LIGHT0)
  17. # 设置光源位置
  18. light_position = [1.0, 1.0, 1.0, 0.0] # directional light
  19. glLightfv(GL_LIGHT0, GL_POSITION, light_position)
  20. # 设置材质属性
  21. material_ambient = [0.3, 0.7, 0.3, 1.0]
  22. material_specular = [0.3, 0.7, 0.3, 1.0]
  23. material_shininess = [50.0]
  24. glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient)
  25. glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular)
  26. glMaterialfv(GL_FRONT, GL_SHININESS, material_shininess)
  27. # 设置视角
  28. gluPerspective(45, (width/height), 0.1, 50.0)
  29. # 移动相机
  30. glTranslatef(0.0, 0.0, -5)
  31. # 初始化3个绿球的角度
  32. ball_angles = [0, 120, 240] # 三个绿球的初始角度
  33. ball_radius = 0.5 # 绿球的半径
  34. distance = 2.5 # 绿球到黄球的距离
  35. # 主循环
  36. running = True
  37. while running:
  38. # 处理事件
  39. for event in pygame.event.get():
  40. if event.type == pygame.QUIT:
  41. running = False
  42. # 清除屏幕
  43. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  44. # 旋转整个场景
  45. glRotatef(1, 3, 1, 1)
  46. # 绘制黄球(中心球)
  47. glMaterialfv(GL_FRONT, GL_DIFFUSE, [1.0, 1.0, 0.0, 1.0]) # 黄色
  48. quad = gluNewQuadric()
  49. gluQuadricNormals(quad, GLU_SMOOTH)
  50. gluSphere(quad, 1, 32, 32)
  51. gluDeleteQuadric(quad)
  52. # 绘制3个绿球和连线
  53. glMaterialfv(GL_FRONT, GL_DIFFUSE, [0.0, 1.0, 0.0, 1.0]) # 绿色
  54. for i, angle in enumerate(ball_angles):
  55. # 计算绿球位置
  56. angle_rad = math.radians(angle)
  57. x = distance * math.cos(angle_rad)
  58. y = distance * math.sin(angle_rad)
  59. z = 0
  60. # 绘制连线(连接到中心黄球)
  61. glBegin(GL_LINES)
  62. glVertex3f(0, 0, 0) # 中心黄球位置
  63. glVertex3f(x, y, z) # 绿球位置
  64. glEnd()
  65. # 保存当前矩阵
  66. glPushMatrix()
  67. # 移动到绿球位置
  68. glTranslatef(x, y, z)
  69. # 绘制绿球
  70. quad = gluNewQuadric()
  71. gluQuadricNormals(quad, GLU_SMOOTH)
  72. gluSphere(quad, ball_radius, 16, 16)
  73. gluDeleteQuadric(quad)
  74. # 恢复矩阵
  75. glPopMatrix()
  76. # 更新绿球角度
  77. ball_angles[i] = (angle + 1) % 360
  78. # 交换缓冲区
  79. pygame.display.flip()
  80. # 控制帧率
  81. pygame.time.wait(10)
  82. # 退出 Pygame
  83. pygame.quit()