Я не могу заставить работать функцию keyCallback в OpenGL и glfw - PullRequest
1 голос
/ 08 апреля 2020
import glfw
from OpenGL.GL import *
import numpy as np

currentMode = GL_LINE_LOOP

def render(currentMode):


def key_callback(window, key, scancode, action, mods):
    if key==glfw.KEY_1:
        if action==glfw.PRESS:
            currentMode = GL_POINTS
    elif key==glfw.KEY_2:
        if action==glfw.PRESS:
            currentMode = GL_LINES
    elif key==glfw.KEY_3:
        if action==glfw.PRESS:
            currentMode = GL_LINE_STRIP

while not glfw.window_should_close(window):
    glfw.poll_events()
    render(currentMode)
    glfw.swap_buffers(window)
    print(currentMode)
glfw.terminate()

Я пытаюсь изменить тип примитива, чтобы использовать параметр функции рендеринга. Но это не работает. Что мне делать?

1 Ответ

0 голосов
/ 08 апреля 2020

Вы пропустили оператор global в key_callback:

def key_callback(window, key, scancode, action, mods):
    global currentMode # <--- THIS IS MISSING

    if key==glfw.KEY_1:
        if action==glfw.PRESS:
            currentMode = GL_POINTS
    # [...]

Переменная currentMode существует дважды. Это переменная в глобальном пространстве имен и локальная переменная в области действия функции key_callback. Используйте оператор global для интерпретации currentMode как глобальной и для записи в глобальную переменную currentMode с помощью key_callback.

Конечно, то же самое относится и к функции main:

def main():
    global currentMode
    # [...]

Кроме того, вы должны очистить буфер кадров в render:

def render(currentMode):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

См. Пример:

import glfw
from OpenGL.GL import *
import numpy as np

def render(currentMode):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()

    print(currentMode)
    glBegin(currentMode)
    #Draw Something
    glVertex2f(-0.5, -0.5)
    glVertex2f(0.5, 0.5)
    glVertex2f(-0.5, 0.5)
    glEnd()

def key_callback(window, key, scancode, action, mods):
    global currentMode
    if key==glfw.KEY_1:
        if action==glfw.PRESS:
            currentMode = GL_POINTS
    elif key==glfw.KEY_2:
        if action==glfw.PRESS:
            currentMode = GL_LINES
    elif key==glfw.KEY_3:
        if action==glfw.PRESS:
            currentMode = GL_LINE_STRIP

def main():
    global currentMode

    if not glfw.init():
        return
    window = glfw.create_window(480, 480, "Test ", None, None)

    if not window:
        glfw.terminate()
        return
    glfw.make_context_current(window)
    glfw.set_key_callback(window, key_callback)
    glfw.swap_interval(1)    

    while not glfw.window_should_close(window):
        glfw.poll_events()
        render(currentMode)
        glfw.swap_buffers(window)
    glfw.terminate()

if __name__ == "__main__":
    currentMode = GL_LINE_LOOP
    main()
...