Attempt to call an undefined function glutInit?

问题描述 投票:0回答:0

我想创建一个康奈尔盒子场景。我用 Python 编写了所有必要的代码并安装了所有必要的库。我尝试在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()```

结果:

我把代码发给了我的一个朋友,他做了很长时间,对他有用。

我已经阅读并尝试过这个 - 它没有用。

python opengl glut pyopengl
© www.soinside.com 2019 - 2024. All rights reserved.