Как сделать окна изменяемого размера с помощью переизбытка?

Я следую примерам программ в OpenGL Superbible, и они звучат так, будто окна, созданные с помощью GlutCreateWindow , будут иметь возможность изменения размера. Я использую свою собственную Python-версию листинга 2.2, приведенного ниже, и размеры моих окон никогда не изменяются. Я использую:PyOpenGL 3.1.7 на macOS Ventura (и «freeglut» (думаю, до того, как я установил freeglut), он был таким же).

Вот список:

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

def change_size(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    aspect_ratio = w/h
    if w <= h:
        glOrtho(-100, 100, -100/aspect_ratio, 100/aspect_ratio, 1, -1)
    else:
        glOrtho(-100*aspect_ratio, 100*aspect_ratio, -100, 100, 1, -1)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    
    
def render_scene():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor(1,0,0,0)
    glRectf(-25,25,25,-25)
    glFlush()
        
def setup_rc():
    glClearColor(0, 0, 1, 1)
    
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA)
    glutCreateWindow("Simple")
    glutDisplayFunc(render_scene)
    glutReshapeFunc(change_size)
    setup_rc()
    glutMainLoop()
    
main()

Есть ли простой способ создать главное окно с возможностью изменения размера?

1 ответ

Glut — старая библиотека, и в различных системах существуют некоторые известные проблемы, например ошибка изменения размера на Mac. Если у вас есть проблемы с перенасыщением вашей системы, я рекомендую вам использовать более новую версию glfw .

установить glfw

      pip3 install glfw

Чтобы переписать код с использованием glfw вместо Glut , необходимо внести всего несколько изменений :

      from OpenGL.GL import *
from glfw.GLFW import *

def change_size(window, _w, _h):
    w, h = glfwGetFramebufferSize(window)
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    aspect_ratio = w/h
    if w <= h:
        glOrtho(-100, 100, -100/aspect_ratio, 100/aspect_ratio, 1, -1)
    else:
        glOrtho(-100*aspect_ratio, 100*aspect_ratio, -100, 100, 1, -1)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    
def render_scene():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor(1,0,0,0)
    glRectf(-25,25,25,-25)
    glFlush()
        
def setup_rc():
    glClearColor(0, 0, 1, 1)
    
def main():
    if glfwInit() == GLFW_FALSE:
        raise Exception("error: init glfw")

    glfwWindowHint(GLFW_SAMPLES, 8)
    window = glfwCreateWindow(640, 480, "Simple", None, None)
    glfwMakeContextCurrent(window)

    setup_rc()
    glfwSetWindowSizeCallback(window, change_size)  
    change_size(window, 640, 480)
    while not glfwWindowShouldClose(window):
        glfwPollEvents()
        render_scene()
        glfwSwapBuffers(window)
    
main()
Другие вопросы по тегам