Как сделать окна изменяемого размера с помощью переизбытка?
Я следую примерам программ в 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 .
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()