Pygame - PyOpenGL



OpenGL 是一種跨語言、跨平臺的 API,用於渲染 2D 和 3D 向量圖形。透過與圖形處理單元 (GPU) 互動,它實現了硬體加速渲染。PyOpenGL 庫是 Python 的 OpenGL 繫結。

我們需要使用 pip 工具安裝它:

pip3 install pyopengl

首先,我們將從 OpenGL.GL 和 OpenGL.GLU(實用程式函式)模組匯入函式。

OpenGL 透過定義頂點或節點來指定空間中的物件。頂點之間的線稱為邊。OpenGL 程式碼編寫在 glBegin 和 glEnd 之間。

在我們的示例中,我們將繪製一個具有以下頂點和邊的立方體:

verticies = (
   (1, -1, -1),
   (1, 1, -1),
   (-1, 1, -1),
   (-1, -1, -1),
   (1, -1, 1),
   (1, 1, 1),
   (-1, -1, 1),
   (-1, 1, 1)
)
edges = (
   (0,1),
   (0,3),
   (0,4),
   (2,1),
   (2,3),
   (2,7),
   (6,3),
   (6,4),
   (6,7),
   (5,1),
   (5,4),
   (5,7)
)

cube() 函式執行 OpenGL 繪製:

def Cube():
   glBegin(GL_LINES)
   for edge in edges:
      for vertex in edge:
         glVertex3fv(verticies[vertex])
   glEnd()

傳遞給 glBegin() 的 GL_LINES 屬性表示要繪製線。

我們需要在 set_mode() 函式中指定 OPENGL 和 DOUBLEBUF 標誌,該函式設定顯示。

pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

然後呼叫 gluPerspective() 來確定透視。第一個引數是視野的角度。第二個值是縱橫比。接下來的兩個值是 znear 和 zfar,它們是近裁剪平面和遠裁剪平面。

gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(0.0,0.0, -5)

在 Pygame 事件迴圈中,首先旋轉當前矩陣,清除顏色緩衝區和深度緩衝區,然後呼叫 cube() 函式。最後,我們更新顯示視窗。

while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()

   glRotatef(1, 3, 1, 1)
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
   Cube()
   pygame.display.flip()
   pygame.time.wait(10)

示例

示例的完整程式碼如下:

import pygame

from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

verticies = (
   (1, -1, -1),
   (1, 1, -1),
   (-1, 1, -1),
   (-1, -1, -1),
   (1, -1, 1),
   (1, 1, 1),
   (-1, -1, 1),
   (-1, 1, 1)
)
edges = (
   (0,1),
   (0,3),
   (0,4),
   (2,1),
   (2,3),
   (2,7),
   (6,3),
   (6,4),
   (6,7),
   (5,1),
   (5,4),
   (5,7)
)
def Cube():
   glBegin(GL_LINES)
   for edge in edges:
      for vertex in edge:
         glVertex3fv(verticies[vertex])
   glEnd()

def main():
   pygame.init()
   display = (800,600)
   pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

   gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)

   glTranslatef(0.0,0.0, -5)

   while True:
      for event in pygame.event.get():
         if event.type == pygame.QUIT:
            pygame.quit()
            quit()
      glRotatef(1, 3, 1, 1)
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
      Cube()
      pygame.display.flip()
      pygame.time.wait(10)

main()

輸出

執行以上程式碼。您將在 Pygame 的視窗表面上看到一個旋轉的立方體。這是 PyOpenGL 功能的簡短演示。本教程不詳細討論此庫。

cross-platform
廣告