【问题标题】:Trying to Graph a Simple Square in pyOpenGL尝试在 pyOpenGL 中绘制一个简单的正方形
【发布时间】:2011-06-17 05:13:16
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

    标签: python opengl pyopengl


    【解决方案1】:

    您需要设置投影矩阵和视口。 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()
    

    【讨论】:

      【解决方案2】:

      尝试设置一个非默认的投影矩阵:

      def display():
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
      
          glMatrixMode(GL_PROJECTION)
          glLoadIdentity()
          glOrtho( 0, 640, 0, 480, -10, 10)
          glMatrixMode(GL_MODELVIEW)
          glLoadIdentity()
      
          ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        相关资源
        最近更新 更多