0

我正在尝试绘制一个简单的立方体并在向左箭头键和向下右键(分别为左方向和右方向)上沿屏幕移动它。我对gluOrtho2d(leftortho,rightortho,bottomortho,toportho)没有确切的想法。我试过 glOrtho(leftortho,rightortho,bottomortho,toportho,-1.0,1.0) 有六个参数,但结果是一样的。立方体移动到右上角并消失了..我需要这方面的帮助..

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;
}
4

2 回答 2

1

试一试:

#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;
}
于 2013-04-28T17:55:21.123 回答
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.

于 2013-04-28T06:40:30.200 回答