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,其他发行版用对应包管理命令。
- Windows:下载freeglut库,将
修复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
相关产品推荐
相关产品推荐

