1.windows平台
1.1 pip install PyOpenGL PyOpenGL_accelerate
执行上述步骤后编写opengl程序通常会遇到如下错误:
OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling
原因:空函数错误,源于没有安装opengl库。上面第1步安装的其实是python环境下调用opengl库的接口库,而不是opengl库。
1.2.到https://pyopengl.sourceforge.net/下载 PyOpenGL-3.1.7.tar.gz 源码包(注意不是二进制包),解压后里面有个DLLS目录,将该目录拷贝到上述PyOpenGL库的安装目录里面即可。如,我的安装路径是:C:\Program Files\Python38\Lib\site-packages\OpenGL\DLLS
2.linux平台(我的为deepin linux 23.3版)
2.1 sudo apt-get install build-essential
build-essential是一个软件包,它包含了在编译和构建c/c++软件时常用的工具和库。它的作用主要有以下几个方面:
提供编译工具:build-essential包含了常用的编译工具,如编译器(gcc)、链接器(ld)等,用于将源代码编译成可执行文件。
提供构建工具:build-essential还包含了一些构建工具,如make和其他一些辅助工具,用于自动化编译和构建过程。
提供必要的库文件:build-essential还包含了一些常用的库文件,如C标准库(libc)和数学库(libm),这些库文件在编译和链接过程中经常被使用。
总之,build-essential的作用是提供了一套完整的工具和库,方便开发者在Linux系统上进行软件的编译和构建工作。
2.2 sudo apt-get install libgl1-mesa-dev 安装OpenGL Library
Home — The Mesa 3D Graphics Library
2.3 sudo apt-get install libglu1-mesa-dev 安装OpenGL Utilities
OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。
2.4 sudo apt-get install libglut-dev 安装OpenGL Utility Toolkit
OpenGL Utility Toolkit 是建立在 OpenGL Utilities 上面的工具箱,除了强化了 OpenGL Utilities 的不足之外,也增加了 OpenGL 对于视窗界面的支援。
注意:在这一步的时候,可能会出现以下情况,shell提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Error: Unable to locate package libglut-dev
意思是:找不到libglut-dev库。可以更换为如下库:
将上述$ sudo apt-get install libglut-dev命令改成$ sudo apt-get install freeglut3-dev即可。
2.5 pip install PyOpenGL PyOpenGL_accelerate。 安装python语言的opengl接口库。
3.例子:
from OpenGL.GL import *
from OpenGL.GLUT import *
def draw_picture_elements():
'''function docstring.
绘制图元:点,线,面(三角形)。
'''
flag=6
# --------绘制(三维)点(世界坐标系)--------
if flag==0:
glBegin(GL_POINTS) # 开始绘制三维顶点(世界坐标系)
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.8, 0.0, 0.0) # 设置顶点
glVertex3f(0.0, 0.0, 0.0) # 设置顶点
glVertex3f(0.8, 0.0, 0.0) # 设置顶点
glEnd() # 结束绘制三维顶点
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制线(世界坐标系)--------
if flag==1:
glBegin(GL_LINES) # 开始绘制线段(世界坐标系)
# 以红色绘制x轴
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.8, 0.0, 0.0) # 设置x轴顶点(x轴负方向)
glVertex3f(0.8, 0.0, 0.0) # 设置x轴顶点(x轴正方向)
# 以绿色绘制y轴
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.0, -0.8, 0.0) # 设置y轴顶点(y轴负方向)
glVertex3f(0.0, 0.8, 0.0) # 设置y轴顶点(y轴正方向)
# 以蓝色绘制z轴
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.0, -0.8) # 设置z轴顶点(z轴负方向)
glVertex3f(0.0, 0.0, 0.8) # 设置z轴顶点(z轴正方向)
glEnd() # 结束绘制线段
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制线--条带(世界坐标系)--------
if flag==2:
glBegin(GL_LINE_STRIP) # 开始绘制线段(世界坐标系)
# 以红色绘制x轴
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.8, 0.0, 0.0) # 设置x轴顶点(x轴负方向)
glVertex3f(0.8, 0.0, 0.0) # 设置x轴顶点(x轴正方向)
# 以绿色绘制y轴
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.0, -0.8, 0.0) # 设置y轴顶点(y轴负方向)
glVertex3f(0.0, 0.8, 0.0) # 设置y轴顶点(y轴正方向)
# 以蓝色绘制z轴
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.0, -0.8) # 设置z轴顶点(z轴负方向)
glVertex3f(0.0, 0.0, 0.8) # 设置z轴顶点(z轴正方向)
glEnd() # 结束绘制线段
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制线--循环线(世界坐标系)--------
if flag==3:
glBegin(GL_LINE_LOOP) # 开始绘制线段(世界坐标系)
# 以红色绘制x轴
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.8, 0.0, 0.0) # 设置x轴顶点(x轴负方向)
glVertex3f(0.8, 0.0, 0.0) # 设置x轴顶点(x轴正方向)
# 以绿色绘制y轴
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.0, -0.8, 0.0) # 设置y轴顶点(y轴负方向)
glVertex3f(0.0, 0.8, 0.0) # 设置y轴顶点(y轴正方向)
# 以蓝色绘制z轴
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.0, -0.8) # 设置z轴顶点(z轴负方向)
glVertex3f(0.0, 0.0, 0.8) # 设置z轴顶点(z轴正方向)
glEnd() # 结束绘制线段
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制三角形(z轴负半区)--------
if flag==4:
glBegin(GL_TRIANGLES) # 开始绘制三角形(z轴负半区)
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.5, -0.5) # 设置三角形顶点
glEnd() # 结束绘制三角形
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制三角形--条带(z轴负半区)--------
if flag==5:
glBegin(GL_TRIANGLE_STRIP) # 开始绘制三角形(z轴负半区)
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.5, -0.5) # 设置三角形顶点
glVertex3f(0.0, 0.8, -0.5) # 设置三角形顶点
glVertex3f(-0.5, 0.7, -0.5) # 设置三角形顶点
glEnd() # 结束绘制三角形
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
# --------绘制三角形--扇形(z轴负半区)--------
if flag==6:
glBegin(GL_TRIANGLE_FAN) # 开始绘制三角形(z轴负半区)
glColor4f(1.0, 0.0, 0.0, 1.0) # 设置当前颜色为红色不透明
glVertex3f(-0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 1.0, 0.0, 1.0) # 设置当前颜色为绿色不透明
glVertex3f(0.5, -0.366, -0.5) # 设置三角形顶点
glColor4f(0.0, 0.0, 1.0, 1.0) # 设置当前颜色为蓝色不透明
glVertex3f(0.0, 0.5, -0.5) # 设置三角形顶点
glVertex3f(0.0, 0.8, -0.5) # 设置三角形顶点
glVertex3f(-0.7, 0.7, -0.5) # 设置三角形顶点
glEnd() # 结束绘制三角形
glFlush() # 清空缓冲区,将指令送往硬件立即执行
return 0
def draw_teapot():
glClear(GL_COLOR_BUFFER_BIT)
glRotatef(0.5, 0, 1, 0)
glutWireTeapot(0.5)
glFlush()
def main():
flag=1
glutInit() # 1. 初始化glut库
glutCreateWindow('title'.encode('utf-8')) # 2. 创建glut窗口
if flag==0:
glutDisplayFunc(draw_picture_elements) # 3. 注册回调函数draw()
if flag==1:
glutDisplayFunc(draw_teapot) # 3. 注册回调函数draw()
glutMainLoop() # 4. 进入glut主循环
return 0
if __name__=='__main__':
print('Main Program Startup.\n')
main()
else:
print('Python_main_program is started as a module.\n')