简体   繁体   中英

Open GL setting an orthographic projection

i am trying to draw and a simple cube and move it along the screen on Left Arrow key and Right key down (left direction and right direction respectively). I donot have exact idea of gluOrtho2d(leftortho,rightortho,bottomortho,toportho). i have tried glOrtho(leftortho,rightortho,bottomortho,toportho,-1.0,1.0) with six parameters but the result is same. The cube moves to upper right corner and vanishes.. I need help in this regard..

double leftortho=5.0,rightortho=1.0,bottomortho=5.0,toportho=1.0;

void init(void) 
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
}

void display(void)
{
    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f (1.0, 1.0, 1.0);
    glutWireCube (1.0);

    gluOrtho2D(leftortho,rightortho,bottomortho,toportho);
    glFlush ();
}

void reshape (int w, int h)
{
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
}

float move_unit = 0.001;
void keyboardown(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_RIGHT:
        {
        leftortho+=move_unit;
        rightortho+=move_unit;
        //bottomortho+=move_unit;
        //toportho+=move_unit;

        break;
        }

    case GLUT_KEY_LEFT:
        {
        leftortho-=move_unit;
        rightortho-=move_unit;
        //bottomortho-=move_unit;
        //toportho-=move_unit;

        break;
        }

    case GLUT_KEY_UP:
        //posY+=move_unit;;
        break;

    case GLUT_KEY_DOWN:
        // posY-=move_unit;;
        break;

    default:
        break;
    }
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    init ();
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape);
    glutSpecialFunc(keyboardown);
    glutMainLoop();
    return 0;
}

Give this a shot:

#include <GL/glut.h>

double leftortho=-1.0;
double rightortho=1.0;
double bottomortho=-1.0;
double toportho=1.0;
float move_unit = 0.01;
void keyboardown(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_RIGHT:
        leftortho-=move_unit;
        rightortho-=move_unit;
        break;

    case GLUT_KEY_LEFT:
        leftortho+=move_unit;
        rightortho+=move_unit;
        break;

    case GLUT_KEY_UP:
        toportho-=move_unit;
        bottomortho-=move_unit;
        break;

    case GLUT_KEY_DOWN:
        toportho+=move_unit;
        bottomortho+=move_unit;
        break;

    default:
        break;
    }
    glutPostRedisplay();
}

void display(void)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glShadeModel (GL_FLAT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho(leftortho,rightortho,bottomortho,toportho, -10, 10);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3f (1.0, 1.0, 1.0);
    glutWireCube (1.0);

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    glutDisplayFunc(display); 
    glutSpecialFunc(keyboardown);
    glutMainLoop();
    return 0;
}

I think the problem is that you are not resetting the projection matrix before calling gluOrtho2d() , so your moves are accumulating. I think you need to do this:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2d(left,right,bottom,top);

Note also that your left and right appear to be swapped, as do your bottom and top. This is legal, but it may end up causing the left and right arrow keys to seem reversed. It basically sets your transformation to be backwards and upside down.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM