Mix 2d and 3d in opengl (using a piglet)

I am trying to mix 2d and 3d in opengl in pyglet, i.e. draw a 3d scene, then switch to the spelling projection and draw the material on top. I draw 3D material, click the projection matrix onto the stack, make the glOrtho projection matrix, draw a 2d material, then pull the previous matrix from the stack. The 3D material is perfectly drawn, but for some reason, part 2d does not draw at all, even by itself. Here is the code:

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)
+5
source share
2 answers

I would recommend that you completely reset the model and projection matrices for each rendering, and then do not use push / pop when switching from 3d to 2d.

, , . partciular , . 2d z = 0.

-1.

, glTranslatef (0, 0.0, -z) draw2d, .

+2

draw2d() glDisable(GL_TEXTURE_2D) glColor3ub(255,255,255) , .

world.draw(), glEnable(GL_TEXTURE_2D), .

0

All Articles