📜  通过Python了解OpenGL(1)

📅  最后修改于: 2023-12-03 15:41:59.299000             🧑  作者: Mango

通过Python了解OpenGL

OpenGL是一种用于绘制2D和3D图形的跨平台图形库。它由Khronos组织开发和维护,能够在不同的操作系统和设备上展示高性能的图形、视频和可视化。

在Python中,我们可以使用PyOpenGL库来调用OpenGL函数和创建三维场景,还可以使用Pygame、PyQt等框架来构建OpenGL应用程序。

PyOpenGL

PyOpenGL是OpenGL Python绑定库,它提供了OpenGL的全部实现,并且可以与其他Python图形库协同工作。在使用PyOpenGL之前,需要先安装OpenGL和GLUT库。

安装PyOpenGL

在安装PyOpenGL之前,需要先安装OpenGL和GLUT库。在Windows操作系统下,可以直接从OpenGL官网下载安装,或者使用Anaconda进行安装。

在安装完OpenGL和GLUT库之后,可以使用pip安装PyOpenGL:

pip install pyopengl

或者使用conda安装:

conda install pyopengl
绘制三角形

用PyOpenGL绘制一个三角形,需要设置顶点坐标、颜色值和绘制方式。具体步骤如下:

  1. 导入OpenGL库和GLUT库

    from OpenGL.GL import *
    from OpenGL.GLU import *
    from OpenGL.GLUT import *
    
  2. 回调函数设置

    def draw():
        glClear(GL_COLOR_BUFFER_BIT)
        glBegin(GL_TRIANGLES)
        glColor3f(1.0, 0.0, 0.0)
        glVertex3f(-0.5, 0.0, 0.0)
        glColor3f(0.0, 1.0, 0.0)
        glVertex3f(0.5, 0.0, 0.0)
        glColor3f(0.0, 0.0, 1.0)
        glVertex3f(0.0, 0.5, 0.0)
        glEnd()
        glFlush()
    
  3. 初始化环境

    def init():
        glClearColor(0.0, 0.0, 0.0, 0.0)
        gluOrtho2D(-1.0, 1.0, -1.0, 1.0)
    
  4. 主函数

    def main():
        glutInit()
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
        glutInitWindowSize(500, 500)
        glutInitWindowPosition(100, 100)
        glutCreateWindow("Triangle")
        glutDisplayFunc(draw)
        init()
        glutMainLoop()
    

完整代码如下:

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


def draw():
    glClear(GL_COLOR_BUFFER_BIT)
    glBegin(GL_TRIANGLES)
    glColor3f(1.0, 0.0, 0.0)
    glVertex3f(-0.5, 0.0, 0.0)
    glColor3f(0.0, 1.0, 0.0)
    glVertex3f(0.5, 0.0, 0.0)
    glColor3f(0.0, 0.0, 1.0)
    glVertex3f(0.0, 0.5, 0.0)
    glEnd()
    glFlush()


def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0)


def main():
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("Triangle")
    glutDisplayFunc(draw)
    init()
    glutMainLoop()
Pygame

Pygame是一个流行的开源Python库,可用于创建成功的2D游戏程序。它已被广泛应用于游戏开发、交互程序和多媒体应用。

使用Pygame也可以轻松地创建一个OpenGL应用程序,只需添加一个OpenGL渲染器即可。

安装Pygame

使用pip命令安装pygame:

pip install pygame
绘制三角形

创建一个OpenGL的渲染器需要引入OpenGL和Pygame库:

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

使用Pygame创建一个OpenGL应用程序的步骤如下:

  1. 初始化Pygame和OpenGL

    def init():
        pygame.init()
        pygame.display.set_mode((width, height), pygame.OPENGL | pygame.DOUBLEBUF)
        glViewport(0, 0, width, height)
        glEnable(GL_DEPTH_TEST)
    
  2. 渲染函数设置

    def draw():
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_MODELVIEW)
        glPushMatrix()
        glRotatef(angle, 0, 0, 1)
        glBegin(GL_TRIANGLES)
        glColor3f(1.0, 0.0, 0.0)
        glVertex3f(-0.5, 0.0, 0.0)
        glColor3f(0.0, 1.0, 0.0)
        glVertex3f(0.5, 0.0, 0.0)
        glColor3f(0.0, 0.0, 1.0)
        glVertex3f(0.0, 0.5, 0.0)
        glEnd()
        glPopMatrix()
        pygame.display.flip()
    
  3. 主函数

    def main():
        global angle
        init()
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    return
            angle += 1
            draw()
            pygame.time.wait(10)
    

完整代码如下:

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


width = 500
height = 500
angle = 0


def init():
    pygame.init()
    pygame.display.set_mode((width, height), pygame.OPENGL | pygame.DOUBLEBUF)
    glViewport(0, 0, width, height)
    glEnable(GL_DEPTH_TEST)


def draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glRotatef(angle, 0, 0, 1)
    glBegin(GL_TRIANGLES)
    glColor3f(1.0, 0.0, 0.0)
    glVertex3f(-0.5, 0.0, 0.0)
    glColor3f(0.0, 1.0, 0.0)
    glVertex3f(0.5, 0.0, 0.0)
    glColor3f(0.0, 0.0, 1.0)
    glVertex3f(0.0, 0.5, 0.0)
    glEnd()
    glPopMatrix()
    pygame.display.flip()


def main():
    global angle
    init()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
        angle += 1
        draw()
        pygame.time.wait(10)


if __name__ == '__main__':
    main()
PyQt

PyQt是一个功能强大的Python库,提供了面向对象的界面设计、网络通信、数据库访问等功能,并且支持多平台运行。它还可以和OpenGL库协同工作来实现2D和3D图形和动画。

安装PyQt

使用pip命令安装PyQt:

pip install PyQt5
绘制三角形

创建一个OpenGL的渲染器需要引入OpenGL和PyQt库:

import sys
from PyQt5.QtWidgets import QApplication, QOpenGLWidget
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
from OpenGL.GL import *
from OpenGL.GLU import *

使用PyQt创建一个OpenGL应用程序的步骤如下:

  1. 创建OpenGLWidget类,用于渲染OpenGL图形

    class OpenGLWidget(QOpenGLWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
        def initializeGL(self):
            glClearColor(0.0, 0.0, 0.0, 0.0)
    
        def resizeGL(self, width, height):
            glViewport(0, 0, width, height)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            gluOrtho2D(-1.0, 1.0, -1.0, 1.0)
    
        def paintGL(self):
            glClear(GL_COLOR_BUFFER_BIT)
            glBegin(GL_TRIANGLES)
            glColor3f(1.0, 0.0, 0.0)
            glVertex3f(-0.5, 0.0, 0.0)
            glColor3f(0.0, 1.0, 0.0)
            glVertex3f(0.5, 0.0, 0.0)
            glColor3f(0.0, 0.0, 1.0)
            glVertex3f(0.0, 0.5, 0.0)
            glEnd()
    
  2. 创建主函数

    def main():
        app = QApplication(sys.argv)
        glwidget = OpenGLWidget()
        glwidget.setGeometry(100, 100, 500, 500)
        glwidget.setWindowTitle("Triangle")
        glwidget.show()
        sys.exit(app.exec_())
    

完整代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QOpenGLWidget
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
from OpenGL.GL import *
from OpenGL.GLU import *


class OpenGLWidget(QOpenGLWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

    def initializeGL(self):
        glClearColor(0.0, 0.0, 0.0, 0.0)

    def resizeGL(self, width, height):
        glViewport(0, 0, width, height)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluOrtho2D(-1.0, 1.0, -1.0, 1.0)

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT)
        glBegin(GL_TRIANGLES)
        glColor3f(1.0, 0.0, 0.0)
        glVertex3f(-0.5, 0.0, 0.0)
        glColor3f(0.0, 1.0, 0.0)
        glVertex3f(0.5, 0.0, 0.0)
        glColor3f(0.0, 0.0, 1.0)
        glVertex3f(0.0, 0.5, 0.0)
        glEnd()


def main():
    app = QApplication(sys.argv)
    glwidget = OpenGLWidget()
    glwidget.setGeometry(100, 100, 500, 500)
    glwidget.setWindowTitle("Triangle")
    glwidget.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()