我正在尝试使用 pyopengl 自学 OpenGL,我对尝试渲染一个以原点为中心的简单 2D 正方形感到震惊。每当我将数组值设置为大于或等于 1 时,形状就会占据整个屏幕,就好像我只查看了轴的一小部分一样。我试图将它基于用 pyopengl 重写的 NeHe 教程,但我找不到我做错了什么。
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def display():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_QUADS)
glVertex3f(2,-2,0)
glVertex3f(2,2,0)
glVertex3f(-2,2,0)
glVertex3f(-2,-2,0)
glEnd()
glutSwapBuffers()
if __name__ == '__main__':
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640,480)
glutCreateWindow("Hello World :'D")
glutDisplayFunc(display)
glutIdleFunc(display)
glutMainLoop()
最佳答案
您需要设置投影矩阵和视口(viewport)。 Python 允许我们使用一些函数式编程以理智的方式完成它:
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def display(w, h):
aspect = float(w)/float(h)
glViewport(0, 0, w, h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-aspect * 5, aspect * 5, -5, 5, -1, 1)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_QUADS)
glVertex3f(2,-2,0)
glVertex3f(2,2,0)
glVertex3f(-2,2,0)
glVertex3f(-2,-2,0)
glEnd()
glutSwapBuffers()
def reshape(w, h):
glutDisplayFunc(lambda: display(w, h))
glutPostRedisplay();
if __name__ == '__main__':
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640,480)
glutCreateWindow("Hello World :'D")
glutReshapeFunc(reshape)
glutIdleFunc(glutPostRedisplay)
glutMainLoop()
关于python - 尝试在 pyOpenGL 中绘制一个简单的正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378297/