سؤال

أحاول خلط ثنائي الأبعاد و 3D في OpenGL في Pyglet ، أي ارسم مشهدًا ثلاثي الأبعاد ثم انتقل إلى الإسقاط الهجائي ورسم الأشياء فوق الجزء العلوي. أرسم الأشياء ثلاثية الأبعاد ، ودفع مصفوفة الإسقاط إلى المكدس ، وأقوم بمصفوفة إسقاط Glortho ، ورسم الأشياء ثنائية الأبعاد ، ثم قم ببث المصفوفة السابقة من المكدس. ترسم الأشياء ثلاثية الأبعاد بشكل جيد ولكن لسبب ما ، الجزء ثنائي الأبعاد لا يرسم على الإطلاق ، حتى من تلقاء نفسه. هذا هو الرمز:

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)
هل كانت مفيدة؟

المحلول

أوصي بإعادة تعيين مصفوفات ModelView و Disprofice بالكامل على كل عرض ، ثم لا تستخدم Push/Pop عند الانتقال من 3D إلى 2D.

ومع ذلك ، أظن أنك تستخدم إحداثيات سيئة ، لذا فإن المشهد يرسم خارج طائرات المقطع. في partciular ، أنا متشكك في وضع طائرة القطع القريبة من الصفر. عادة ما يتم رسم العناصر 2D مع z = 0.

حاول وضع مشبك القريب في -1.

أنا أيضًا غير متأكد قليلاً لماذا تتصل بـ Gltranslatef (0 ، 0.0 ، -Z) في Draw2D ، لن أزعجني.

نصائح أخرى

في draw2d() محاولة glDisable(GL_TEXTURE_2D) و glColor3ub(255,255,255) قبل رسم مثلثك.

تأكد من إعادةglEnable(GL_TEXTURE_2D) قبل الاتصال world.draw() مرة أخرى إذا كان يستخدم هندسة محكم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top