You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python OpenGL实现Cornell Box时glutInit未定义错误求助

问题:运行Cornell Box Python代码时出现glutInit未定义错误

运行以下Python代码创建Cornell Box场景时,PyCharm中抛出错误:

OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

代码如下:

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


lamp_pos = (0, 99.9, -350)
light_range = 15


def draw_lamp(x, y, z, side_len):
    glBegin(GL_QUADS)
    glVertex3f(x - side_len / 2, y, z - side_len / 2)
    glVertex3f(x + side_len / 2, y, z - side_len / 2)
    glVertex3f(x + side_len / 2, y, z + side_len / 2)
    glVertex3f(x - side_len / 2, y, z + side_len / 2)
    glEnd()


def show_lamp():
    glColor3f(1, 1, 1)
    glNormal3f(0, -1, 0)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [1, 1, 1, 1])
    draw_lamp(lamp_pos[0], lamp_pos[2] + 0.01, lamp_pos[2], 40)
    glDisable(GL_LIGHT0)


def lighting():
    pos0 = [lamp_pos[0] - light_range, lamp_pos[2], lamp_pos[2], 1]
    pos1 = [lamp_pos[0] + light_range, lamp_pos[2], lamp_pos[2], 1]
    pos2 = [lamp_pos[0], lamp_pos[2], lamp_pos[2] + light_range, 1]
    pos3 = [lamp_pos[0], lamp_pos[2], lamp_pos[2] - light_range, 1]

    glShadeModel(GL_SMOOTH)
    glEnable(GL_LIGHTING)
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, [0, 0, 0, 1])
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHT1)
    glEnable(GL_LIGHT2)
    glEnable(GL_LIGHT3)

    glLightfv(GL_LIGHT0, GL_AMBIENT, [0.1, 0.1, 0.1, 0])
    glLightfv(GL_LIGHT1, GL_AMBIENT, [0.1, 0.1, 0.1, 0])
    glLightfv(GL_LIGHT2, GL_AMBIENT, [0.1, 0.1, 0.1, 0])
    glLightfv(GL_LIGHT3, GL_AMBIENT, [0.1, 0.1, 0.1, 0])

    glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.4, 0.4, 0.4, 1])
    glLightfv(GL_LIGHT1, GL_DIFFUSE, [0.4, 0.4, 0.4, 1])
    glLightfv(GL_LIGHT2, GL_DIFFUSE, [0.4, 0.4, 0.4, 1])
    glLightfv(GL_LIGHT3, GL_DIFFUSE, [0.4, 0.4, 0.4, 1])

    glLightfv(GL_LIGHT0, GL_POSITION, pos0)
    glLightfv(GL_LIGHT1, GL_POSITION, pos1)
    glLightfv(GL_LIGHT2, GL_POSITION, pos2)
    glLightfv(GL_LIGHT3, GL_POSITION, pos3)

    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.001)
    glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.001)
    glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.001)
    glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, 0.001)

    glEnable(GL_COLOR_MATERIAL)
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)


def draw_box():
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT)

    show_lamp()

    # Floor
    glBegin(GL_QUADS)
    glColor3f(112 / 255, 149 / 255, 225 / 255)
    glNormal3f(0, 1, 0)
    for i in range(0, 300):
        for j in range(0, 300):
            glVertex3f(-100 + j, -100, -300 - i)
            glVertex3f(-100 + j + 1, -100, -300 - i)
            glVertex3f(-100 + j + 1, -100, -300 - i - 1)
            glVertex3f(-100 + j, -100, -300 - i - 1)
    glEnd()

    # Left wall
    glColor3f(116 / 255, 255 / 255, 225 / 255)
    glBegin(GL_QUADS)
    glNormal3f(1, 0, 0)
    for i in range(0, 300):
        for j in range(0, 300):
            glVertex3f(-100, -100 + i, -300 - j)
            glVertex3f(-100, -100 + i, -300 - j - 1)
            glVertex3f(-100, -100 + i + 1, -300 - j - 1)
            glVertex3f(-100, -100 + i + 1, -300 - j)
    glEnd()

    # Right wall
    glColor3f(116 / 255, 255 / 255, 225 / 255)
    glBegin(GL_QUADS)
    glNormal3f(-1, 0, 0)
    for i in range(0, 300):
        for j in range(0, 300):
            glVertex3f(100, -100 + j, -300 - i)
            glVertex3f(100, -100 + j + 1, -300 - i)
            glVertex3f(100, -100 + j + 1, -300 - i - 1)
            glVertex3f(100, -100 + j, -300 - i - 1)
    glEnd()

    # Back wall
    glColor3f(234 / 255, 232 / 255, 116 / 255)
    glBegin(GL_QUADS)
    glNormal3f(0, 0, 1)
    for i in range(0, 300):
        for j in range(0, 300):
            glVertex3f(-100, -100, -500)
            glVertex3f(-100 + j, -100, -500)
            glVertex3f(-100 + j, -100 + i, -500)
            glVertex3f(-100, -100 + i, -500)
    glEnd()

    # Ceil
    glColor3f(1, 1, 1)
    glBegin(GL_QUADS)
    glNormal3f(0, -1, 0)
    for i in range(0, 300):
        for j in range(0, 300):
            glVertex3f(-100 + i, 100, -300 - j)
            glVertex3f(-100 + i, 100, -300 - j - 1)
            glVertex3f(-100 + i + 1, 100, -300 - j - 1)
            glVertex3f(-100 + i + 1, 100, -300 - j)
    glEnd()


def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1.0, 1.0, 1.0)
    glClearColor(0, 0.6, 0, 0)

    lighting()

    draw_box()

    # Draw cone
    glPushMatrix()
    glTranslatef(-50, -80, -320)
    glRotatef(270, 1, 0, 0)
    glColor3f(193 / 255, 115 / 255, 235 / 255)
    glutSolidCone(20, 80, 20, 20)
    glPopMatrix()

    # Draw cube
    glPushMatrix()
    glTranslatef(50, -80, -440)
    glRotatef(25, 0, 1, 0)
    glColor4f(240 / 255, 144 / 255, 84 / 255, 1)
    glutSolidCube(50)
    glPopMatrix()

    glFlush()


def reshape(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(-100, 100, -100, 100, 300, 600)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()


def main():
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)

    glutInitWindowSize(1050, 1050)
    glutInitWindowPosition(100, 150)
    glutCreateWindow("Belov Michael")

    glutDisplayFunc(display)
    glutReshapeFunc(reshape)

    glEnable(GL_DEPTH_TEST)
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

    glutMainLoop()


if __name__ == '__main__':
    main()

补充说明:相同代码在朋友的开发环境中可正常运行。


解决方案

  • 检查PyCharm解释器一致性:打开File > Settings > Project: [项目名] > Python Interpreter,确认当前解释器已安装PyOpenGL和PyOpenGL-accelerate。若缺失,点击+搜索安装,或在终端执行pip install pyopengl pyopengl-accelerate。

  • 安装系统级GLUT库:PyOpenGL依赖底层GLUT库,不同系统安装方式:

    • Windows:下载freeglut库,将freeglut.dll放入Python的Scripts目录或系统System32目录。
    • macOS:用Homebrew执行brew install freeglut。
    • Linux:Debian/Ubuntu系执行sudo apt-get install freeglut3-dev,其他发行版用对应包管理命令。
  • 修复GLUT导入逻辑:尝试显式导入所需GLUT函数,避免隐式导入失败:

    from OpenGL.GLUT import glutInit, glutInitDisplayMode, glutInitWindowSize, glutInitWindowPosition, glutCreateWindow, glutDisplayFunc, glutReshapeFunc, glutMainLoop, glutSolidCone, glutSolidCube
    

    或在调用前检查函数是否存在:

    def main():
        if not bool(glutInit):
            raise RuntimeError("GLUT初始化失败,请检查GLUT库安装")
        glutInit()
        # 后续代码...
    
  • 重装依赖:卸载现有PyOpenGL后重新安装最新版本:

    pip uninstall pyopengl pyopengl-accelerate -y
    pip install pyopengl pyopengl-accelerate
    

内容的提问来源于stack exchange,提问作者Jane Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:09:52