python编程之opengl编程环境安装配置步骤。

本文详细描述了在Windows和Linux(DeepinLinux23.3)平台上安装和配置OpenGL库,包括PyOpenGL接口库的安装,以及如何处理在运行OpenGL程序时可能出现的错误,如`glutInit`函数缺失问题。
摘要由CSDN通过智能技术生成

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')
 

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
兼容Python 3.12的OpenGL库有多个选择,其中最常用的是PyOpenGL。PyOpenGLPython语言OpenGL绑定库,它提供了对OpenGL API的完整访问。以下是使用PyOpenGL的一些步骤: 1. 安装PyOpenGL:可以使用pip命令在Python环境安装PyOpenGL。在命令行中运行以下命令: ``` pip install PyOpenGL ``` 2. 导入PyOpenGL模块:在Python脚本中导入PyOpenGL模块,以便可以使用其中的函数和类。例如: ```python from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * ``` 3. 创建OpenGL窗口:使用PyOpenGL提供的函数创建一个OpenGL窗口,以便可以在其中进行绘制。例如: ```python def draw(): glClear(GL_COLOR_BUFFER_BIT) # 绘制代码 glutSwapBuffers() glutInit() glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutInitWindowSize(800, 600) glutCreateWindow(b"OpenGL Window") glutDisplayFunc(draw) glutMainLoop() ``` 4. 编写绘制代码:在绘制函数中编写OpenGL绘制代码,例如绘制图形、设置光照等。可以使用PyOpenGL提供的函数和常量来操作OpenGL。例如: ```python def draw(): glClear(GL_COLOR_BUFFER_BIT) glColor3f(1.0, 0.0, 0.0) glBegin(GL_TRIANGLES) glVertex2f(-0.5, -0.5) glVertex2f(0.5, -0.5) glVertex2f(0.0, 0.5) glEnd() glutSwapBuffers() ``` 这是一个简单的使用PyOpenGL的示例,你可以根据自己的需求进行更复杂的OpenGL编程。如果你需要更多关于PyOpenGL的信息,可以查阅官方文档或者其他相关资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值