true isometric projection with opengl

前端 未结 4 473
深忆病人
深忆病人 2020-12-01 08:28

I am a newbie in OpenGL programming with C++ and not very good at mathematics. Is there a simple way to have isometric projection?

I mean the true isometric projecti

4条回答
  •  南笙
    南笙 (楼主)
    2020-12-01 09:03

    If you do not want to use GLU, here is bare bones using glOrtho

    void gl_enter_2_5d_mode (void)
    {
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
    
        glLoadIdentity();
    
        double scale = 50;
        glOrtho(-scale,
                scale,
                -scale * 0.7,
                scale * 0.7,
                -scale,
                scale);
    
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
    
        glLoadIdentity();
    
        glRotatef(35.264f, 1.0f, 0.0f, 0.0f);
        glRotatef(-45.0f, 0.0f, 1.0f, 0.0f);
    }
    
    void gl_leave_2_5d_mode (void)
    {
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
    
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
    }
    
    then draw a cube in it
    
    void cube (double size)
    {
        glBegin(GL_QUADS);
    
        glVertex3f(size,size,size);
        glVertex3f(-size,size,size);
        glVertex3f(-size,-size,size);
        glVertex3f(size,-size,size);
    
        glVertex3f(size,size,-size);
        glVertex3f(-size,size,-size);
        glVertex3f(-size,-size,-size);
        glVertex3f(size,-size,-size);
    
        glVertex3f(size,size,size);
        glVertex3f(size,-size,size);
        glVertex3f(size,-size,-size);
        glVertex3f(size,size,-size);
    
        glVertex3f(-size,size,size);
        glVertex3f(-size,-size,size);
        glVertex3f(-size,-size,-size);
        glVertex3f(-size,size,-size);
    
        glVertex3f(size,size,size);
        glVertex3f(-size,size,size);
        glVertex3f(-size,size,-size);
        glVertex3f(size,size,-size);
    
        glVertex3f(size,-size,size);
        glVertex3f(-size,-size,size);
        glVertex3f(-size,-size,-size);
        glVertex3f(size,-size,-size);
    
        glEnd();
    }
    
    void test (void)
    {
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glBindTexture(GL_TEXTURE_2D, 0);
        cube(1.0);
        glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    }
    

    and call something like this

    gl_enter_2_5d_mode()
    test()
    gl_leave_2_5d_mode()
    

    should you want to toggle between 2d and 2.5d (so you can draw your UI) then I have similar functions to enter and leave 2d mode e.g.

    void gl_init_2d_mode (void)
    {
        /*
         * Enable Texture Mapping
         */
        glEnable(GL_TEXTURE_2D);
    
        /*
         * Enable alpha blending for sprites
         */
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
        /*
         * Setup our viewport
         */
        glViewport(0, 0, game.video_pix_width,
                   game.video_pix_height);
    
        /*
         * Make sure we're changing the model view and not the projection
         */
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
    
        /*
         * Reset the view
         */
        glLoadIdentity();
    
        gl_init_fbo();
    }
    
    void gl_enter_2d_mode (void)
    {
        /*
         * Change to the projection matrix and set our viewing volume.
         */
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
    
        /*
         * Reset the view
         */
        glLoadIdentity();
    
        /*
         * 2D projection
         */
        glOrtho(0,
                 game.video_gl_width, game.video_gl_height,
                 0, -1200.0, 1200.0);
    
        /*
         * Make sure we're changing the model view and not the projection
         */
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
    
        /*
         * Reset the view
         */
        glLoadIdentity();
    }
    

提交回复
热议问题