2010-11-24 7 views
5

Ich versuche, 2D und 3D in OpenGL in Pyglet zu mischen, d. H. Eine 3D-Szene zeichnen, dann auf orthographische Projektion und zeichnen Zeug über die Spitze. Ich zeichne das 3D-Zeug, schiebe die Projektionsmatrix auf den -Stapel, mache eine GlOrtho-Projektionsmatrix, zeichne das 2D-Zeug und öffne dann die vorherige Matrix vom Stapel. Das 3D-Material zeichnet sich gut aus, aber aus irgendeinem Grund zeichnet sich der 2D-Teil überhaupt nicht ab, auch nicht von alleine. Hier ist der Code:Mischen von 2D und 3D in OpenGL (mit pyglet)

class Window(pyglet.window.Window): 

    # resolution 
    width, height = 1024, 786 

    def __init__(self, width, height): 

     # initialise window 
     super(Window, self).__init__(width, height) 

     # set title 
     self.set_caption("OpenGL Doss") 

     # call update() at 30fps 
     pyglet.clock.schedule_interval(self.update, 1/30.0) 

     glEnable(GL_TEXTURE_2D)   # enable textures 
     glShadeModel(GL_SMOOTH)   # smooth shading of polygons 
     glClearColor(0.0, 0.0, 0.0, 0.0) 

     glClearDepth(1.0) 

     glDepthFunc(GL_LEQUAL)   
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) # make stuff look nice 

     self.world = World()   # initialise world 

     self.label = pyglet.text.Label('Hello, world', 
          font_name='Times New Roman', 
          font_size=20, 
          width=10, height=10) 

    def on_resize(self, width, height): 
     print 'on resize' 
     if height == 0: 
      height = 1 
     glViewport(0, 0, width, height) # specify viewport 

     # load perspective projection matrix 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     gluPerspective(45, 1.0 * width/height, 0.1, 100.0) 
     #glLoadIdentity() 

    def on_draw(self): 
     self.set3d() 

     # draw 3d stuff 
     self.world.draw() 

     self.set2d() 

     # draw 2d stuff 
     self.draw2d() 

     self.unSet2d() 

    def update(self, dt): 
     "called at set interval during runtime" 
     #maze = self.world.maze 
     maze_platform = self.world.maze_platform 

     pacman = maze_platform.maze.pacman 

     maze_platform.update() 

     # send it world pointer 
     pacman.update(self.world) 



    def on_key_press(self, symbol, modifiers): 
     control.press(symbol, modifiers) 

    def on_key_release(self, symbol, modifiers): 
     control.release(symbol, modifiers) 

    def set3d(self): 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     glEnable(GL_DEPTH_TEST)   # enable depth testing 
     # reset modelview matrix 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 

    def set2d(self): 

     glDisable(GL_DEPTH_TEST) 
     # store the projection matrix to restore later 
     glMatrixMode(GL_PROJECTION) 
     glPushMatrix() 

     # load orthographic projection matrix 
     glLoadIdentity() 
     #glOrtho(0, float(self.width),0, float(self.height), 0, 1) 
     far = 8192 
     glOrtho(-self.width/2., self.width/2., -self.height/2., self.height/2., 0, far) 

     # reset modelview 
     glMatrixMode(GL_MODELVIEW) 
     glLoadIdentity() 

     #glClear(GL_COLOR_BUFFER_BIT) 



    def unSet2d(self): 

     # load back the projection matrix saved before 
     glMatrixMode(GL_PROJECTION) 
     glPopMatrix() 

    def draw2d(self): 
     z=-6 
     n=100 
     glTranslatef(0, 0.0, -z) 


     glBegin(GL_TRIANGLES) 
     glVertex3f(0.0, n, 0.0) 
     glVertex3f(-n, -n, 0) 
     glVertex3f(n, -n, 0) 
     glEnd() 


def main(): 
    window = Window(Window.width, Window.height) 
    pyglet.app.run() 
    print 'framerate:', pyglet.clock.get_fps(), '(error checking = %s)' % pyglet.options['debug_gl'] 

if __name__ == '__main__': main() 
    #command = 'main()' 
    #cProfile.run(command) 

Antwort

2

Ich würde empfehlen, dass Sie die Modellansicht und Projektionsmatrizen auf jedem Rendern vollständig zurücksetzen, und verwenden Sie dann nicht Push/Pop, wenn Sie von 3d zu 2d gehen.

Allerdings vermute ich, dass Sie schlechte Koordinaten verwenden, so dass die Szene außerhalb der Clip-Ebenen zeichnet. Zum Teil bin ich ein wenig verdächtig, die nahe Clipping-Ebene auf Null zu setzen. Normalerweise werden 2d Elemente mit z = 0 gezeichnet.

Versuchen Sie, die nahe Clip-Ebene auf -1 zu setzen.

Ich bin auch ein bisschen unsicher, warum Sie glTranslatef (0, 0.0, -z) in draw2d aufrufen, würde ich nicht stören.

+0

Ich habe festgestellt, dass ich es nur auf der falschen Seite der Clipping-Ebene gezeichnet habe, und ja, dass die Übersetzung völlig sinnlos ist. – eggbert

0

In draw2d() versuchen glDisable(GL_TEXTURE_2D) und glColor3ub(255,255,255) vor Ihrem Dreieck zeichnen.

Stellen Sie sicher, dass Sie erneut glEnable(GL_TEXTURE_2D) aufrufen, bevor Sie erneut world.draw() aufrufen, wenn es texturierte Geometrie verwendet.