Python PyOpenGL介绍
在本教程中,我们将学习有关 Python 中的 PyOpenGL 库及其用法。OpenGL 是一个开源库,支持多个平台,如 Windows、Linux 和 MacOS。它也被多个编程语言支持。我们将使用 Python 编程语言来实现它。
简介
OpenGL 是一个相对简单的库,比其他图形库容易实现。它是一个跨语言的 API,因此它可以在其他编程语言中使用。在 OpenGL 中,我们需要在空间中指定对象,例如-要创建立方体,我们需要指定“角落”。角落被称为顶点(复数)或顶点(单数)。
安装
我们可以使用 pip 包管理器轻松安装它。在终端中运行以下命令并在系统中安装 OpenGL。
pip install pyopengl pyopengl_accelerate
上述命令将在本地系统中安装 PyOpenGL。我们将获得以下输出。
您可以通过以下步骤手动下载它:
- 转到指定链接并向下滚动到“下载和安装”标题。
- 从该部分下载所有必要的文件。
- 导航到下载文件的文件夹。
- 在终端或命令提示符中运行适当的命令以安装或执行文件。
python setup.py
此命令将安装文件并设置必要的环境,以便程序运行。
请注意,上面的命令假定 python 和安装工具已安装在系统上,并且 setup.py 文件与终端或命令提示符打开的文件夹位于同一文件夹中。
现在,让我们通过编码移动到实现。
实现
第一步是在代码中导入 OpenGL。要执行此操作,请运行以下命令。
import OpenGL
在继续之前,必须导入一些其他依赖项,以便在我们的程序中使用此库。尝试在程序中使用库之前应安装这些依赖项。以下是一些库:
import OpenGL.GL
import OpenGL.GLUT
import OpenGL.GLU
print("Imports successful!")
当我们运行上面的代码段时,我们可以获得“导入成功”,这意味着我们已经成功安装了库。
现在,让我们通过使用 OpenGL 库创建一个用于显示图形的窗口。以下代码将创建一个窗口,并注释将解释其工作方式。
示例 –
from OpenGL.GLUT import *
from OpenGL.GL import *
from OpenGL.GLU import *
def showScreen():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 清除屏幕并重置颜色和深度缓冲区
# 初始化允许我们自定义窗口的 GLUT 实例
glutInit()
# 设置显示模式以使用 RGB 颜色
glutInitDisplayMode(GLUT_RGBA)
# 设置窗口的宽度和高度
glutInitWindowSize(500, 500)
# 设置窗口在屏幕上的位置
glutInitWindowPosition(0, 0)
# 给窗口一个标题
wind = glutCreateWindow("OpenGL Graphics Window") glutDisplayFunc(showScreen) # 告诉 GLUT 调用 showScreen 函数以连续更新窗口
glutIdleFunc(showScreen) # 在 showScreen 函数中始终绘制任何图形或形状
glutMainLoop() # 保持上面创建的窗口循环显示/运行
说明 –
在上面的代码中,我们创建了一个标题为“OpenGL图形窗口”的窗口,其大小为500×500像素,位于屏幕左上角。 glutDisplayFunc()和glutIdleFunc()方法将持续调用showScreen()函数。该函数负责清除屏幕并显示任何图形或形状。 glutMainLoop()函数负责保持窗口打开并更新其内容。请注意,上面的代码使用python-OpenGL绑定,如果您使用其他编程语言,则可能使用不同的库。
现在,我们将使用OpenGL创建正方形,但我们应该熟悉OpenGL遵循的坐标系统-
窗口中的(0,0)点表示窗口的左下角。如果我们从该点向上移动,我们沿着y轴遍历,如果我们从该点向右移动,我们沿着x轴遍历。因此,窗口的左上角将是(0,500),右上角将是(500,500),右下角将是(500,0)。
值得注意的是,y轴随着向上移动而增加,而x轴随着向右移动而增加,这与传统的笛卡尔坐标系相反。
让我们编写创建正方形的代码。
代码示例-
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
#定义坐标
w, h = 500,500
#创建正方形的函数
def square():
glBegin(GL_QUADS) # 开始画图
glVertex2f(100, 100) # 左下点的坐标
glVertex2f(200, 100) # 右下点的坐标
glVertex2f(200, 200) # 右上点坐标
glVertex2f(100, 200) # 左上点的坐标
glEnd() # 结束画图
# 初始化窗口并显示正方形
def showScreen():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # 移除显示屏上所有的内容(即全部变为白色)
glLoadIdentity() # 重置所有的图形/形状的位置
square() # 使用我们的函数画一个正方形
glutSwapBuffers()
glutInit()
glutInitDisplayMode(GLUT_RGBA) # 设置显示模式为彩色
glutInitWindowSize(500, 500) # 设置你的窗口的宽度和高度
glutInitWindowPosition(0, 0) # 设置该窗口应该出现的位置
wind = glutCreateWindow("OpenGL Coding Practice") # 设置窗口的标题
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen) # 保持该窗口一直处于打开状态
glutMainLoop() # 让上面创建的窗口一直处于循环状态运行着
解释-
上面的代码创建了一个OpenGL窗口,标题为“OpenGL Coding Practice”,大小为500×500像素,位于屏幕左上角。它将创建一个彩色的窗口并将连续调用 showScreen()函数。 在 showScreen()函数中,它会清除屏幕,重置图形/形状的位置,调用“方块”函数(该函数将使用指定的顶点坐标绘制方块)并交换缓冲区。它将创建一个带有固定正方形的窗口,并让该窗口保持打开状态并在循环中运行。
然而,我们的代码还不完整。 如果绘制正方形并清空屏幕,那么当它真正绘制时,我们将无法看到该正方形,因为它会在瞬间出现和消失。 让我们编写另一个函数。
代码示例-
def iterate():
glViewport(0, 0, 500,500)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)
glMatrixMode (GL_MODELVIEW)
glLoadIdentity()
现在,让我们将所有代码段合并到单个代码文件中,以便没有歧义。
代码示例-
```python
从 OpenGL.GL 中导入 *
从 OpenGL.GLUT 中导入 *
从 OpenGL.GLU 中导入 *
w,h = 500, 500
def square():
glBegin(GL_QUADS)
glVertex2f(100, 100)
glVertex2f(200, 100)
glVertex2f(200, 200)
glVertex2f(100, 200)
glEnd()
def iterate():
glViewport(0, 0, 500, 500)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def showScreen():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
iterate()
glColor3f(1.0, 0.0, 3.0)
square()
glutSwapBuffers()
glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(500, 500)
glutInitWindowPosition(0, 0)
wind = glutCreateWindow("OpenGL 编码示例")
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)
glutMainLoop()
解释
在以上代码中,我们使用 OpenGL.GLUT 库创建了一个窗口并将显示模式设置为 GLUT_RGBA。我们设置了窗口的大小和位置,创建了一个标题为“OpenGL 编码示例”的窗口,并将显示和空闲函数设置为 showScreen 函数。
showScreen 函数清除屏幕,加载单位矩阵,调用迭代函数来设置视口、投影矩阵和模型视图矩阵。我们设置要绘制的正方形的颜色,然后调用绘制正方形的 square 函数。
glutMainLoop() 函数开始 GLUT 程序的主要循环,并保持窗口打开,显示屏幕上的正方形。
结论
本教程介绍了 OpenGL 的使用方法,该库用于创建三维图形。教程涵盖了下载和安装该库的过程,以及一个演示如何使用 OpenGL 创建基本形状的示例程序。该示例程序还概述了在使用此库绘制形状过程中使用的一些函数调用。总的来说,虽然使用 OpenGL 可能具有挑战性,但它是创建三维图形的强大工具,并为有经验的用户提供了广泛的可能性。